Autor Thema: Programm fehler  (Gelesen 588 mal)

0 Mitglieder und 2 Gäste betrachten dieses Thema.

  • amando
  • Gast
  • Allow
Programm fehler
« am: April 09, 2009, 22:50:15 pm »
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);
   }


  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
    • Beiträge: 1502
    • Karma: +733/-4
    • Mitglied seit:
      14 Jul 2008
  • Broker: IBFX AU, IBFX US

  • Allow
Re: Programm fehler
« Antwort #1 am: April 09, 2009, 23:33:00 pm »
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.

Zitat
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
« Letzte Änderung: April 09, 2009, 23:35:15 pm von PriNova »
Copyright © 2008-2012
Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen

  • amando
  • Gast
  • Allow
Re: Programm fehler
« Antwort #2 am: April 10, 2009, 09:39:55 am »
sowas hab ich mir schon gedacht
wollts nur nicht wahrhaben

werds gleich mal testen

  • amando
  • Gast
  • Allow
Re: Programm fehler
« Antwort #3 am: April 10, 2009, 09:50:02 am »
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

  • Global Moderator
  • Ist Forum süchtig
  • *
  • *
    • Beiträge: 1502
    • Karma: +733/-4
    • Mitglied seit:
      14 Jul 2008
  • Broker: IBFX AU, IBFX US

  • Allow
Re: Programm fehler
« Antwort #4 am: April 10, 2009, 11:08:03 am »
du könntest vielleicht anstatt einer else-anweisung eine if-schleife einbauen, welche die lotgröße abfragt.

Zitat
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-2012
Es ist Dir nicht erlaubt Links zu betrachten. Registrieren oder Einloggen

  • amando
  • Gast
  • Allow
Re: Programm fehler
« Antwort #5 am: April 17, 2009, 10:40:06 am »
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

 

Ähnliche Themen

  Betreff / Begonnen von Antworten Letzter Beitrag
1 Antworten
580 Aufrufe
Letzter Beitrag Juni 02, 2009, 10:23:22 am
von TJPLD
20 Antworten
812 Aufrufe
Letzter Beitrag Oktober 01, 2010, 09:08:33 am
von Movement
21 Antworten
1421 Aufrufe
Letzter Beitrag Februar 13, 2011, 11:35:42 am
von nightyhawk
7 Antworten
943 Aufrufe
Letzter Beitrag März 10, 2011, 07:46:05 am
von forexler
4 Antworten
491 Aufrufe
Letzter Beitrag August 31, 2011, 22:46:07 pm
von traderdoc
6 Antworten
213 Aufrufe
Letzter Beitrag November 18, 2011, 12:24:54 pm
von forexler
11 Antworten
474 Aufrufe
Letzter Beitrag Februar 07, 2012, 09:05:54 am
von Dabo
1 Antworten
94 Aufrufe
Letzter Beitrag April 16, 2012, 16:04:24 pm
von NeoTrader


ChartTec´s World Topsites