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

 
kwng111 :


Üzgünüm, ilanınız bana madmax3 için çözüm değil gibi görünüyor

void CloseAll() adlı bir işlevde ( ) işlemleri değiştirmeniz gerekmez
Ayrıca orada OrderSymbol ( ) ve OrderMagicNumber() öğesini seçmeniz gerekir.

ve programın bu bölümünde

        }
         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 );
    }
}

bekleyen ticaretler hala değiştirilecek

 

İşte tüm EA için gözden geçirilmiş kod:

 //+------------------------------------------------------------------+
//|                                                  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.

CloseAll() işlevi, çok uzun süre devam ederse, işlemleri belirli bir zamanda kapatmak için oradadır.

Kodun bu kısmı, anlamaya çalıştığım şeyin gözden geçirilmiş kısmıdır:
(Gördüğünüz gibi MagicNumber ve Symbol orada, ancak yalnızca bekleyen siparişler hala değiştiriliyor)

     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 ());}
 
deVries :
         }
         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 );
    }
}

 for ( int cnt= OrdersTotal ()- 1 ;cnt>= 0 ;cnt--)
   {
       OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
 int total= OrdersTotal ();
 if (total> 1 )

Seçimin dün çalışmayacağı söylendi . Ve dönüş kodlarını ve yaklaşık toplamı test etmeniz gerektiğini

Mesajları okumaya ve kodunuzu düzeltmeye zahmet etmeyecekseniz, size yardım etmeye çalışmayacağız.

 
WHRoeder :

Seçimin dün çalışmayacağı söylendi . Ve dönüş kodlarını ve yaklaşık toplamı test etmeniz gerektiğini

Mesajları okumaya ve kodunuzu düzeltmeye zahmet etmeyecekseniz, size yardım etmeye çalışmayacağız.


Yukarıdakilerin ikisini de yaptım, yanlış kişiden bahsediyorsunuz sanırım. Ben orijinal poster değilim, deVries değil ve kodu şu şekilde değiştirdim (daha önce yayınlandığı gibi):

   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 ());}

Şimdiki sorun, bekleyen emirleri değiştirmesi, ben ise sadece açık emirleri ve sadece aynı sembolden iki açık emir aynı anda açık ve çalışır durumdayken değiştirmesini istiyorum. Farklı numara kombinasyonları ve OrderSelect numaraları denedim ama yine de buna şaşırdım.

 
madmax3 :


Yukarıdakilerin ikisini de yaptım, yanlış kişiden bahsediyorsunuz sanırım. Ben orijinal poster değilim, deVries değil ve kodu şu şekilde değiştirdim (daha önce yayınlandığı gibi):

Şimdiki sorun, bekleyen emirleri değiştirmesi, ben ise sadece açık emirleri ve sadece aynı sembolden iki açık emir aynı anda açık ve çalışır durumdayken değiştirmesini istiyorum. Farklı numara kombinasyonları ve OrderSelect numaraları denedim ama yine de buna şaşırdım.

Bu nedenle, açık siparişleriniz arasında dolaşmanız, yukarıda yaptığınız gibi Symbol ve MagicNumber'ı kontrol etmeniz gerekir. . . ancak OrderType() <= OP_SELL öğesini de kontrol etmeniz gerekir . . . 2 ise eşleşen siparişleri sayın. . . sonra tekrar döngü ve OrderModify().

Öğrenmenin tek yolu, her bir işlevle ilgili Belgeleri okumak ve nasıl çalıştıklarını anlamaktır. . . örneğin OrderType()

 

Farklı kodların bir varyasyonunu denedim ama yine de tam olarak çalışmasını sağlayamıyorum. İki açık olduğunda açık işlemlerden birini değiştirir ve değiştirmeye devam eder, sadece bir kez değiştirilmesine ihtiyacım var ve her iki işlemin de değiştirilmesine ihtiyacım var.

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


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



   return ( 0 );
  }}

Ne yapmam gerektiğine dair herhangi bir öneriniz var mı? btw belgelerini okudum.

 
Sipariş değiştirilmeden önceki ve değiştirildikten sonraki fark nedir? hangi değişiklikler ?
 

İlk iki emir belirlenir, ardından bunlardan biri (bu durumda belirli bir tarihi test ettiğimde bir satış) gerçekleştirilir. Günün ilerleyen saatlerinde (hala orada olan) ikinci emir gerçekleştirilir ve bu işlem bir satın almadır.
Satış 1. sipariş ve satın alma 2. sipariştir. Satın alma (2. sipariş) TakeProfit'i 16.3 pip ile değiştirmiştir (neden 20 pip eklemediğinden emin değilim), ardından TakeProfit aynı anda 0.2 pip artırılmıştır. dakika ve bu olmaya devam ediyor, TakeProfit gün boyunca sürekli değişiyor, bazen artıyor, bazen azalıyor, bunun neden olduğundan emin değilim.

Düzenleme: Sanırım 16.3 pip ve diğer değişiklikler de spread'den etkileniyor?

 
Tamam, başa dönebilir miyiz? . . . İki siparişi değiştirmeye çalıştığınızı biliyorum. . . ama tam olarak ne yapmaya çalışıyorsun? kuyruk SL? başka bir şey ? ne elde etmeye çalışıyorsun?
 
madmax3 2012.03.09 15:06
WHRoeder :

Seçimin dün çalışmayacağı söylendi . Ve dönüş kodlarını ve yaklaşık toplamı test etmeniz gerektiğini

Mesajları okumaya ve kodunuzu düzeltmeye zahmet etmeyecekseniz, size yardım etmeye çalışmayacağız.


Yukarıdakilerin ikisini de yaptım, yanlış kişiden bahsediyorsunuz sanırım

Direkt bir önceki yazınıza atıfta bulunuyordum.

madmax3 2012.03.09 14:52
İşte tüm EA için gözden geçirilmiş kod:
   total= OrdersTotal ();
   if (total< 1 ) 
Bu hala belirttiğim sorunları gösteriyor.