Inhalte aufrufen

  • Über Facebook anmelden Über Twitter anmelden Über WindowsLive anmelden Log In with Google Anmelden
  • Mitglied werden

Programm fehler

- - - - -

  • Du kannst leider keine neuen Themen eröffnen
  • Please log in to reply
5 Antworten zu diesem Thema

  #1
amando

Hallo leute

vielleicht kann mir ja wer von euch weiterhelfen

habe folgendes programm
der erste teil mit der halben lotgröße schliessen funkt noch
nur dann, die restliche poition rausnehmen bei erreichen des SMA geht nicht mehr
keine ahnung warum


SMA = iMA(NULL,0,25,0,MODE_SMA,PRICE_CLOSE,0);


for (i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderComment()==Text){
//close open positions at EOD
if( OrderMagicNumber() == OrderLots()*100 ) {


if (OrderType() == OP_BUY && Bid - (OrderOpenPrice() - OrderStopLoss())>= OrderOpenPrice() ){
OrderClose(OrderTicket(), OrderLots() / 2 ,Bid,3,Green);
}

if (OrderType() == OP_SELL && Ask + (OrderStopLoss() - OrderOpenPrice())<= OrderOpenPrice() ){
OrderClose(OrderTicket(), OrderLots() / 2 ,Bid,3,Green);
}

}
Sleep(10000);
}


else {


if(OrderType()==OP_BUY){
if(OrderType() == OP_BUY && SMA == Ask &&(OrderOpenTime()+ Stunden*60*60) <= TimeCurrent()){
OrderClose(OrderTicket(), OrderLots(),Bid,3,Green);
Sleep(10000);
}
}
if(OrderType()==OP_SELL){
if(SMA >= (Bid-3*Point) && SMA <= (Ask + 3*Point) &&(OrderOpenTime()+ Stunden*60*60) <= TimeCurrent()){
OrderClose(OrderTicket(), OrderLots() ,Ask,3,Green);
Sleep(10000);
}
}
}


}

return(0);
}

  #2
OFFLINE   PriNova

ok, um das ganze mal nachzuvollziehen, hab ich den code mal etwas förmlich geändert. also die {} blocks in extra zeile, sowie tabulatoren gesetzt um diese block besser erkenntlich zu machen.

SMA = iMA(NULL,0,25,0,MODE_SMA,PRICE_CLOSE,0);//hier die SMA abfrage.sollte klar sein


for (i=0;i<OrdersTotal();i++)//schleife zur abfrage aller Orders. auch klar
{
 OrderSelect(i,SELECT_BY_POS,MODE_TRADES);// die jeweilige order abfragen. also eine art pointer setzen
 if(OrderComment()==Text)// abfrage, ob der kommentar der selektierten order den text enthält, welcher in der variable Text
 { //gespeichert ist
//close open positions at EOD // wenn ja, dann erfolgt der algorithmus zum schliessen der halben order
if( OrderMagicNumber() == OrderLots()*100 )
{
 if (OrderType() == OP_BUY && Bid - (OrderOpenPrice() - OrderStopLoss())>= OrderOpenPrice() )
 {
OrderClose(OrderTicket(), OrderLots() / 2 ,Bid,3,Green);
 }
 if (OrderType() == OP_SELL && Ask + (OrderStopLoss() - OrderOpenPrice())<= OrderOpenPrice() )
 {
OrderClose(OrderTicket(), OrderLots() / 2 ,Bid,3,Green);
 }
}
Sleep(10000);
 } else //stutzig macht mich diese 'else' anweisung, da sich diese auf die zeile beruht,
 {//welche den orderkommentar abfragt. und da sich dieser ja nicht ersichtlich ändert
if(OrderType()==OP_BUY)//wird das programm niemals in diese 'else'-schleife springen.
{
 if(OrderType() == OP_BUY && SMA == Ask &&(OrderOpenTime()+ Stunden*60*60) <= TimeCurrent())
 {
OrderClose(OrderTicket(), OrderLots(),Bid,3,Green);
Sleep(10000);
 } 

if(OrderType()==OP_SELL)
{
 if(SMA >= (Bid-3*Point) && SMA <= (Ask + 3*Point) && (OrderOpenTime()+ Stunden*60*60) <= TimeCurrent())
 {
OrderClose(OrderTicket(), OrderLots() ,Ask,3,Green);
Sleep(10000);
 }
}
 }
}
 
return(0);
}


du müsstest, wenn du die Orders zur hälfte geschlossen hast, den kommentar der order ändern, damit die else schleife wirksam wird. das machst du durch den OrderModify-Befehl um damit den kommentar zu ändern. beim nächsten durchlauf würde dann die else-schleife durchlaufen werden, da der kommentar der selektierten order nicht mehr der Variable 'Text' entspräche.

vielleicht klappts ja dann.

PriNova

Copyright © 2008-2016

Als Nomade quer durch Europa. Bei Interesse auch Hausbesuche 😉

  #3
amando

sowas hab ich mir schon gedacht
wollts nur nicht wahrhaben

werds gleich mal testen


  #4
amando

Du hast natürlich recht Prima Nova
leider kann ich den Order Kommentar nicht mit OrderModify ändern

was die else schleife angeht geb ich dir 100% recht, so überlegt kann das gar nicht gehen

allerdings gehts auch nicht, wenn ich das else weglasse so dass nur noch

if(OrderType()==OP_BUY)//wird das programm niemals in diese 'else'-schleife springen.
{
if(OrderType() == OP_BUY && SMA == Ask &&(OrderOpenTime()+ Stunden*60*60) <= TimeCurrent())
{
OrderClose(OrderTicket(), OrderLots(),Bid,3,Green);
Sleep(10000);
}

dort steht.
das ignoriert er genauso wissentlich
es macht auch keinen unterschied wenn ich die 2 if schleifen in einer zeile zusammenfasse bzw ob ich davor noch einmal die

for (i=0;i<OrdersTotal();i++)//schleife zur abfrage aller Orders. auch klar
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);// die jeweilige order abfragen. also eine art pointer setzen
if(OrderComment()==Text)// abfrage, ob der kommentar der selektierten order den text enthält, welcher in der variable Text
{//gespeichert ist

Schleife zum initialisieren der order verwende


  #5
OFFLINE   PriNova

du könntest vielleicht anstatt einer else-anweisung eine if-schleife einbauen, welche die lotgröße abfragt.

Comment = DoubleToStr(Lots,2); //als OrderComment die Lotgröße speichern
OrderSend(Symbol(), OP_BUY, Lots, Ask, slippage, StopLoss, TakeProfit, Comment, MagicNumber, 0, Blue); //und benutzen

...

SMA = iMA(NULL,0,25,0,MODE_SMA,PRICE_CLOSE,0);

for (i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber()==MagicNumber)
{
//close open positions at EOD

if (OrderType() == OP_BUY && Bid - (OrderOpenPrice() - OrderStopLoss())>= OrderOpenPrice() )
{
OrderClose(OrderTicket(), OrderLots() / 2 ,Bid,3,Green);
}
if (OrderType() == OP_SELL && Ask + (OrderStopLoss() - OrderOpenPrice())<= OrderOpenPrice() )
{
OrderClose(OrderTicket(), OrderLots() / 2 ,Bid,3,Green);
}

Sleep(10000);
}
//if(OrderType()==OP_BUY)zweimal nach dem OrderTyp zu fragen ist auch überflüssig das machst du ja schon in der zweiten if-schleife
if (OrderLots() < StrToDouble(OrderComment()) //diese abfrage könnte das Problem lösen.
{
if(OrderType() == OP_BUY && SMA == Ask &&(OrderOpenTime()+ Stunden*60*60) <= TimeCurrent())
{
{
OrderClose(OrderTicket(), OrderLots(),Bid,3,Green);
Sleep(10000);
}
}
if(OrderType()==OP_SELL)
{
if(SMA >= (Bid-3*Point) && SMA <= (Ask + 3*Point) &&(OrderOpenTime()+ Stunden*60*60) <= TimeCurrent())
{
OrderClose(OrderTicket(), OrderLots() ,Ask,3,Green);
Sleep(10000);
}
}
}
}

return(0);
}


also, meine idee ist es die Lotgröße als Orderkommentar zu speichern und im OrderSend-funktion verwenden. später wird dann die MagicNummer abgefragt anstatt der OrderComment. also die erste schleife bleibt gleich. die zweite schleife fragt, dann ab wie der Kommentar also die eigentliche originale Lotgröße ist und vergleicht diese mit der momentanen Lotgröße der selektierten Order. ist diese kleiner so wird die bedingung erfüllt und alle weiteren if-schleifen werden abgefragt. sollte so eigentlich klappen. vielleicht auch nicht. probiers einfach mal aus.


grüße

PriNova
Copyright © 2008-2016

Als Nomade quer durch Europa. Bei Interesse auch Hausbesuche 😉

  #6
amando

danke für deinen Tip

habs endlich gelöst, das mit dem kommntar geht ja leider nicht da der Metatrader den kommentar nach rausnehmen der ersten hälte ändert.
hier die kopie wies gefunkt hat, ist zwar von einem anderen ea aber das selbe prinzip

for (cnt=0;cnt<OrdersTotal();cnt++){
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if( OrderComment() == Text){

// Breakeven start----------------------------------------------------------------------------------

if( OrderType()==OP_BUY &&(Bid - (OrderOpenPrice() - OrderStopLoss()) ) >= OrderOpenPrice() ){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),0,0,Green);
OrderClose(OrderTicket(), OrderLots() / 2 ,Bid,3,Green);
Sleep(10000);
}


if( OrderType()==OP_SELL && (Ask + (OrderStopLoss() - OrderOpenPrice()) ) <= OrderOpenPrice() ) {
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),0,0,Green);
OrderClose (OrderTicket(), OrderLots() / 2 ,Ask,3,Green);
Sleep(10000);
}
}
// Breakeven ende------------------------------------------------------------------------------------------------
if ( OrderLots()*100 < OrderMagicNumber() ) {

if ( OrderType() == OP_BUY && (Bid + 15*Point) < EMAnow ){
OrderClose(OrderTicket(), OrderLots(), Bid,3,Green);
}

if ( OrderType() == OP_SELL && (Ask - 15*Point) > EMAnow){
OrderClose (OrderTicket(), OrderLots() ,Ask,3,Green);
}
}
}

der ausschlaggebende punkt war, dass ich beim ordersetzen für die Magicnumber = NormalizeDouble(Lots*100,0) gesetzt habe um die kommastellen zu eleminieren

lg




Similar Topics

  Thema Eröffnet von Statistik Letzter Beitrag




0 Benutzer lesen gerade dieses Thema

0 Mitglieder, 0 Gäste, 0 anonyme Nutzer