EA için gereken basit kod (iki açık siparişi değiştirin)

 

Belirli bir sembolün iki işlemi açık olduğunda, iki işlemin kârını değiştirecek bir şeyi kodlamaya çalışıyorum, esasen,

Sipariş Toplamı=2 ise

Çeşitli OrderSelect işlevlerini denedim, ancak çalışmasını sağlayamıyorum, bu tür bir görevi yürütmek için gerekli kodu bana verebilecek olan var mı?

Teşekkürler,

madmax3

 
Çalışmayan kodunuzu gösterin. . . öğrenmenin en iyi yolu budur.
 
 int total= OrdersTotal ();
 if (total> 1 )
                   OrderSelect (total+ 1 , SELECT_BY_POS, MODE_TRADES);
                   
   if ( OrderType ()==OP_BUY)  
   OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit+ 20 )* Point ), 0 , Blue );
   
   if ( OrderType ()==OP_SELL)
   OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit- 20 )* Point ), 0 , Blue );

Kullandığım kod bu.

Bunu kullanmayı da denedim,

   string Symb= Symbol ();                         // Symbol
//------------------------------------------------------------------------------- 2 --
   for ( int i= 1 ; i<= OrdersTotal (); i++)           // Cycle searching in orders
     {
       if ( OrderSelect (i- 1 ,SELECT_BY_POS)==true) // If the next is available
        {                                       // Analysis of orders:
         int Tip= OrderType ();                   // Order type
         if ( OrderSymbol ()!=Symb||Tip> 1 ) continue ; // The order is not "ours"
         double SL= OrderStopLoss ();             // SL of the selected order
         double TP    = OrderTakeProfit ();
         {TP=Ask+(TakeProfit+ 20 * Point );

Bu, tüm EA'dır ( güncellendi ):

//+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int      MagicNumber = 20080122 ;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double   TakeProfit  = 28 ;
extern double   StopLoss    = 55 ;
extern double   Lots        = 0.1 ;
extern int      StartHour   = 2300 ;       // Open Trade time
extern bool     OpenBuy     = true;
extern bool     OpenSell    = true;
extern int      NumBuys     = 1 ;
extern int      NumSells    = 1 ;
extern int      Slippage    = 2 ;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
       if ( TimeDayOfWeek ( TimeCurrent ())== 5 && TimeCurrent ()>= StrToTime ( "22:59" )) { CloseAll(); return ( 0 ); }
   int ct;
//-------------------------------------+
   if ( Bars < 100 )
     {
       Print ( "bars less than 100" );
       return ( 0 );  
     }
//-------------------------------------+

//-------------------------------------+
   if (TakeProfit< 10 )
     {
       Print ( "TakeProfit less than 10" );
       return ( 0 );   // check TakeProfit
     }
//-------------------------------------+

   ct = Hour () * 100 + Minute ();
   total= OrdersTotal ();
   if (total< 1 ) 
     {
       // no opened orders identified
       if ( AccountFreeMargin ()<( 1000 *Lots))
        {
         Print ( "We have no money. Free Margin = " , AccountFreeMargin ());
         return ( 0 );  
        }
       // check for long position (BUY) possibility
       if (ct == StartHour && Close[ 1 ]>Open[ 1 ] && OpenBuy)
       //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0 ; cnt < NumBuys; cnt++)
         {
           ticket= OrderSend ( Symbol (),OP_BUYSTOP,Lots,Ask+(DistancefromAsk* Point ),Slippage,Bid-(StopLoss* Point ),Ask+(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE );
           ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Bid-(DistancefromBid* Point ),Slippage,Ask+(StopLoss* Point ),Bid-(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE ); 
           if (ticket> 0 )
           {
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ( "BUY order opened : " , OrderOpenPrice ());
           }

          
           else Print ( "Error opening BUY order : " , GetLastError ()); 
           

         }
         return ; 
        }
       // check for short position (SELL) possibility
       if (ct == StartHour && Close[ 1 ]<Open[ 1 ] && OpenSell)
       //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0 ; cnt < NumSells; cnt++)
         {
           ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Bid-(DistancefromAsk* Point ),Slippage,Ask+(StopLoss* Point ),Bid-(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE );
           ticket= OrderSend ( Symbol (),OP_BUYSTOP,Lots,Ask+(DistancefromBid* Point ),Slippage,Bid-(StopLoss* Point ),Ask+(TakeProfit* Point ), "" ,MagicNumber, TimeCurrent ()+ 39600 , CLR_NONE );
           if (ticket> 0 )
           {
             if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ( "SELL order opened : " , OrderOpenPrice ());
           }
           else Print ( "Error opening SELL order : " , GetLastError ());
         } 
         return ; 
        
    
}

     }
 
     for ( int iPos = OrdersTotal ()- 1 ; iPos >= 0 ; iPos--) if (
         OrderSelect (iPos, SELECT_BY_POS)                     // Only my orders w/
    &&   OrderMagicNumber ()  == MagicNumber                 // my magic number
    &&   OrderSymbol ()       == "EURUSD"                  // and my pair.
    ){ OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit+ 20 )* Point ), 0 , Blue );
       if (! OrderSelect (iPos, SELECT_BY_POS))
   Alert ( "OrderSelect failed: " , GetLastError ());}


   return ( 0 );
  }
  
  
  
   void CloseAll()
{
   for ( int cnt= OrdersTotal ()- 1 ;cnt>= 0 ;cnt--)
   {
       OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
         
       //
       //
       //
       //
       //
         
       if ( OrderType ()==OP_BUY || OrderType ()==OP_SELL)
      {
         for ( int c= 0 ; c< 3 ; c++)
         {
             RefreshRates ();
             if ( OrderType ()==OP_BUY)
                  { double cp = Bid;}  
             else   {        cp = Ask;}
               
             OrderClose ( OrderTicket (), OrderLots (),cp, 0 , Yellow );
               int err= GetLastError ();
               if (err== 4 || err== 136 || err== 137 || err== 138 || err== 146 )
               {
                   Sleep ( 5000 ); continue ;
               }  
               break ;                     
         }
         break ;
      }
   }





}

// the end.
 

İlk kod bitinde . . . .

 OrderSelect (total+ 1 , SELECT_BY_POS, MODE_TRADES);

burada var olmayan bir Sipariş seçiyorsunuz. 4 Emiriniz varsa, toplam 4 olacak ve pozisyon numaraları 0, 1, 2 ve 3 olacaktır. . . 5. pozisyonu seçtiniz. OrderSelect() bir bool döndürür, eğer bu dönüş değerini kontrol etmiş olsaydınız, bunun yanlış olduğunu görürdünüz ve o zaman bir şeylerin yanlış olduğunu anlardınız.

 

İkinci kod biti, gittiği kadarıyla iyi görünüyor. . . . neden bu satırın başında { var ?

{  TP=Ask+(TakeProfit+ 20 * Point );
 
RaptorUK :

İlk kod bitinde . . . .

burada var olmayan bir Sipariş seçiyorsunuz. 4 Emiriniz varsa, toplam 4 olacak ve pozisyon numaraları 0, 1, 2 ve 3 olacaktır. . . 5. pozisyonu seçtiniz. OrderSelect() bir bool döndürür, eğer bu dönüş değerini kontrol etmiş olsaydınız, bunun yanlış olduğunu görürdünüz ve o zaman bir şeylerin yanlış olduğunu anlardınız.


Dönüş değerini nasıl kontrol edebilirim? Dergide bulamıyorum, btw MQL'de bir çaylakım, sadece gördüğüm kodu anlamaya çalışıyorum.

Sıra seçimine gelince, çeşitli sayılar denedim ama yine de çalışmıyor, 'toplam'ı da kendi kendine denedim. İki sipariş seçmek için nasıl giderdim?

Teşekkürler,

madmax3

 

Ah, neden emin değilim { orada, hata, şimdi kaldırdı .

İkinci kod parçasını nasıl geliştiririm?

 
  1. madmax3 :
    Dönüş değerini nasıl kontrol edebilirim?
     if (! OrderSelect (...))
       Alert ( "OrderSelect failed: " , GetLastError ());

  2.  int total= OrdersTotal ();
     if (total> 1 )
    Bu, EA'yı diğer grafiklerde ve manuel ticarette dahil olmak üzere diğerleriyle uyumsuz hale getirir.
         for ( int iPos = OrdersTotal ()- 1 ; iPos >= 0 ; iPos--) if (
             OrderSelect (iPos, SELECT_BY_POS)                     // Only my orders w/
        &&   OrderMagicNumber ()  == Magic.Number                 // my magic number
        &&   OrderSymbol ()       == chart.symbol                 // and my pair.
        ){
            :

 

Tamam, şimdiye kadar bu var,

 for ( int iPos = OrdersTotal ()- 1 ; iPos >= 0 ; iPos--) if (
         OrderSelect (iPos, SELECT_BY_POS)                     // Only my orders w/
    &&   OrderMagicNumber ()  == MagicNumber                 // my magic number
    &&   OrderSymbol ()       == "EURUSD"                  // and my pair.
    ){ OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),Ask+((TakeProfit+ 20 )* Point ), 0 , Blue );
       if (! OrderSelect (iPos, SELECT_BY_POS))
   Alert ( "OrderSelect failed: " , GetLastError ());}

İlk satırda çeşitli numaralar denedim, EA şimdi bekleyen emirleri değiştiriyor gibi görünüyor, ben ise açık emirleri değiştirmem gerekiyor ve sadece iki tane varsa açık emirleri değiştiriyorum. Ayrıca, sırayı sürekli olarak değiştiriyor gibi görünüyor.

Ayrıca EA böyle çalışır,

  • Önce belirli bir zamanda bekleyen iki emir (bir satış ve satın alma durdurma) verir.
  • Siparişler, yerine getirilmezse belirli bir zamanda sona erer
  • Her iki emir de açılırsa, her iki açık işlemin kârını al değiştirilmelidir.
OrderSelect'i değiştirmem gerekir mi, önceden açılmış takasları nasıl değiştirebilirim?
 
madmax3 :

Tamam, şimdiye kadar bu var,

İlk satırda çeşitli numaralar denedim, EA şimdi bekleyen emirleri değiştiriyor gibi görünüyor, ben ise açık emirleri değiştirmem gerekiyor ve sadece iki tane varsa açık emirleri değiştiriyorum. Ayrıca, sırayı sürekli olarak değiştiriyor gibi görünüyor.

Ayrıca EA böyle çalışır,

  • Önce belirli bir zamanda bekleyen iki emir (bir satış ve satın alma durdurma) verir.
  • Siparişler, yerine getirilmezse belirli bir zamanda sona erer
  • Her iki emir de açılırsa, her iki açık işlemin kârını al değiştirilmelidir.

Ardından OrderType() öğesini de seçin
 
//+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int     MagicNumber = 20080122;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double  TakeProfit  = 28;
extern double  StopLoss    = 55;
extern double  Lots        = 0.1;
extern int     StartHour   = 2300;      // Open Trade time
extern bool    OpenBuy     = true;
extern bool    OpenSell    = true;
extern int     NumBuys     = 1;
extern int     NumSells    = 1;
extern int     Slippage    = 2;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
      if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); }
   int ct;
//-------------------------------------+
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
//-------------------------------------+

//-------------------------------------+
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
//-------------------------------------+

   ct = Hour() * 100 + Minute();
   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(ct == StartHour && Close[1]>Open[1] && OpenBuy)
      //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0; cnt < NumBuys; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); 
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }

          
           else Print("Error opening BUY order : ",GetLastError()); 
           

         }
         return; 
        }
      // check for short position (SELL) possibility
      if(ct == StartHour && Close[1]<Open[1] && OpenSell)
      //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0; cnt < NumSells; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
           else Print("Error opening SELL order : ",GetLastError());
         } 
         return; 
        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

     }
 


   return(0);
  }
  
  void CloseAll()
{
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()!=MagicNumber) continue;
         
      //
      //
      //
      //
      //
         
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
      {
         for(int c=0; c<3; c++)
         {
            RefreshRates();
            if (OrderType()==OP_BUY)
                  { double cp = Bid;}  
            else  {        cp = Ask;}
               
            OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow);
               int err=GetLastError();
               if(err==4 || err==136 || err==137 || err==138 || err==146)
               {
                  Sleep(5000); continue;
               }  
               break;                     
         }
         break;
      }
   }
 { 
 int total=OrdersTotal();
 if(total>1)
                   OrderSelect(total+1, SELECT_BY_POS, MODE_TRADES);
                   
   if(OrderType()==OP_BUY)  
   OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
   
   if(OrderType()==OP_SELL)
   OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);

} 

}



// the end.


	          
Neden: