MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 614

 
Vitaly Muzichenko :

Eh, kritik hatalar göstermedin.

İşlev nasıl çalışır, kendinize cevap verdiniz:


Test cihazında normal. Bu aslında böyle oluyor.
Dosyalar:
yOXZsAXZ-X4.jpg  479 kb
 
Tigerfreerun :
Test cihazında normal. Bu aslında böyle oluyor.

Peki, bu durumda, kodla ilgilenmeniz, tüm değerleri yazdırmanız ( Print (...) ) ve hatanın nereden geldiğini görmeniz gerekir.

 
Tigerfreerun :
Test cihazında normal. Bu aslında böyle oluyor.

Sana cevap verdiler:

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

MQL4, yardım ve algoritmalar ve kodlar hakkında herhangi bir acemi sorusu

Alexey Viktorov , 2018.09.06 21:00

Düşünülmesi gereken yön: Kar sıfırdan küçükse... sıralama sırasında dizi ne boyutta olacak???

Ve hiç sipariş olmazsa dizinin boyutu ne olacak???
Tüm kazançlar sıfırdan büyük DEĞİLSE, birinci boyutta sıralanan a[2] dizisinin boyutunu düşünün.
 

Tünaydın! Expert Advisor'a roly-poly denir, ancak planlandığı gibi çalışmaz. lot kırmızıda kapanırsa ikiye katlanır, ancak müteakip TP kapanışı nedense daha önce kapatılan eksi işlemlerin geri dönüşüne izin vermez. Bana neyin yanlış olduğunu söyle, çözemiyorum. Cevap veren herkese şimdiden teşekkürler.

 extern string TimeStart    = "04:00" ;   //Время начала контрольного периода
extern string TimeEnd      = "09:00" ;   //Время окончания контрольного периода
extern string TimeCloseOrder = "23:30" ; //Время в которое происходит закрытие всех ордеров
extern double LOT          = 0.1 ;
extern int     Magic        = 777 ;
extern double K_martin     = 2 ;
extern bool    No_Loss      = true ;
int slippage = 3 ;
double marga,Lot,SL,TP;
int tip,Orders,tipOrders,TradeDey;
//-------------------------------------------------------------------+
int init()
{
   if ( Digits == 5 || Digits == 3 ) slippage = 30 ;
}
int start()
{
   datetime Time_Start      = StrToTime ( StringConcatenate ( Day (), "." , Month (), "." , Year (), " " ,TimeStart,     ":00" ));
   datetime Time_End        = StrToTime ( StringConcatenate ( Day (), "." , Month (), "." , Year (), " " ,TimeEnd,       ":00" ));
   datetime Time_CloseOrder = StrToTime ( StringConcatenate ( Day (), "." , Month (), "." , Year (), " " ,TimeCloseOrder, ":00" ));

   if (Time_CloseOrder>Time_End) if ( CurTime ()>=Time_CloseOrder) CLOSEORDERS();

   int tip;
   if (Orders> OrdersTotal ()) tip=CloseOrder();
   Orders= OrdersTotal ();

   if (ORDERS( 0 )== 0 && tip== 0 && ( CurTime ()<Time_CloseOrder || Time_CloseOrder<=Time_End) && TradeDey!= TimeDay ( CurTime ()))
   {
       int BarStart = iBarShift ( NULL , 0 ,Time_Start, false );
       int BarEnd   = iBarShift ( NULL , 0 ,Time_End  , false );
       double Max_Price= iHigh ( NULL , 0 , iHighest ( NULL , 0 , MODE_HIGH ,BarStart-BarEnd,BarEnd));
       double Min_Price= iLow ( NULL , 0 , iLowest ( NULL , 0 , MODE_LOW , BarStart-BarEnd,BarEnd));
   
       if ( TimeCurrent ()>Time_End && ObjectFind ( "bar0" +Time_End)==- 1 )
      {
         ObjectCreate ( "bar0" +Time_End, OBJ_RECTANGLE , 0 , 0 , 0 , 0 , 0 );
         ObjectSet    ( "bar0" +Time_End, OBJPROP_STYLE , STYLE_SOLID );
         ObjectSet    ( "bar0" +Time_End, OBJPROP_COLOR , Blue);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_BACK ,   true );
         ObjectSet    ( "bar0" +Time_End, OBJPROP_TIME1 ,Time_Start);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_PRICE1 ,Max_Price);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_TIME2 ,Time_End);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_PRICE2 ,Min_Price);
      }
      
       if ( Bid >Max_Price) OrderSend ( Symbol (), OP_BUY ,LOT, Bid ,slippage,Min_Price,
         NormalizeDouble ( Ask + Max_Price-Min_Price, Digits ), "BreakdownLevel" ,Magic,Blue);
       if ( Bid <Min_Price) OrderSend ( Symbol (), OP_SELL ,LOT, Bid ,slippage,Max_Price,
         NormalizeDouble ( Bid - Max_Price+Min_Price, Digits ), "BreakdownLevel" ,Magic,Blue);
       return ;
   }
   if (No_Loss) No_Loss();
   if (tip== 1 && TradeDey!= TimeDay ( CurTime ()))
   {
      Lot=Lot*K_martin;
       if (tipOrders== 0 ) OrderSend ( Symbol (), OP_SELL ,Lot, Bid ,slippage,SL,TP, "Nevalyashka" ,Magic,Blue);
       if (tipOrders== 1 ) OrderSend ( Symbol (), OP_BUY ,Lot, Ask ,slippage,SL,TP, "Nevalyashka" ,Magic,Blue);
   }
   return ( 0 );
}
//-------------------------------------------------------------------+
int CloseOrder()
{
   string txt;
   double loss;
   int i= OrdersHistoryTotal ()- 1 ;
   if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )== true )
   {                                     
       if ( OrderSymbol ()== Symbol () && Magic== OrderMagicNumber ())
      {
         tipOrders= OrderType ();
         Lot= OrderLots ();
         loss = MathAbs ( OrderProfit ()/ MarketInfo ( Symbol (), MODE_TICKVALUE )/Lot/K_martin);
         if (tipOrders== 0 )
         {
            TP= NormalizeDouble ( Bid - loss* Point , Digits );
            SL= NormalizeDouble ( Ask + loss* Point , Digits );
         }
         if (tipOrders== 1 )
         {
            SL= NormalizeDouble ( Bid - loss* Point , Digits );
            TP= NormalizeDouble ( Ask + loss* Point , Digits );
         }
         if ( OrderClosePrice ()== OrderTakeProfit () || OrderProfit ()>= 0 ) TradeDey= TimeDay ( CurTime ());
         if ( OrderClosePrice ()== OrderStopLoss ()) return ( 1 );
      }
   }  
   return ( 0 );
}
//+-----------------------------------------------------------------+
int ORDERS( int tip)
{
   int N_Sell,N_Buy;
   for ( int i= 0 ; i< OrdersTotal (); i++)
   {                                               
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true )
      {
         if ( OrderSymbol ()== Symbol () && Magic== OrderMagicNumber ())
         {
             if ( OrderType ()== OP_BUY ) N_Buy++;
             if ( OrderType ()== OP_SELL ) N_Sell++;
         }
      }   
   }
if (tip== 0 ) return (N_Buy+N_Sell);
if (tip== 1 ) return (N_Buy);
if (tip==- 1 ) return (N_Sell);
}                  
//-------------------------------------------------------------------+
void No_Loss()
{
   int tip;
   double TP,OOP;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) 
   {
       if ( OrderSelect (i, SELECT_BY_POS )== true )
      {
         tip = OrderType ();
         if (tip< 2 && OrderSymbol ()== Symbol ())
         {
             if ( OrderMagicNumber ()!=Magic) continue ;
            TP = OrderTakeProfit ();
            OOP = OrderOpenPrice ();
             if (tip== 0 ) //Bay               
            {  
               if ( OrderStopLoss ()> OrderOpenPrice ()+ Ask - Bid ) return ;
               if ((TP-OOP)/ 2 +OOP<= Bid )
               OrderModify ( OrderTicket (),OOP, NormalizeDouble (OOP+ Ask - Bid , Digits ),TP, 0 ,White);
            }                                         
             if (tip== 1 ) //Sell               
            {                                         
               if ( OrderStopLoss ()< OrderOpenPrice ()- Ask + Bid ) return ;
               if (OOP-(OOP-TP)/ 2 >= Ask )
               OrderModify ( OrderTicket (),OOP, NormalizeDouble (OOP- Ask + Bid , Digits ),TP, 0 ,White);
            } 
         }
      }
   }
}
//------------------------------------------------------------------+
void CLOSEORDERS()
{
   bool error;
   int err;
   while ( true )
   {  error= true ;
       for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
      {                                               
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true )
         {
             if ( OrderSymbol ()!= Symbol ()||Magic!= OrderMagicNumber ()) continue ;
             if ( OrderType ()== OP_BUY )
               error= OrderClose ( OrderTicket (), OrderLots (), Bid , 3 ,CLR_NONE);
             if ( OrderType ()== OP_SELL )
               error= OrderClose ( OrderTicket (), OrderLots (), Ask , 3 ,CLR_NONE);
         }   
      }
       if (!error) {err++; Sleep ( 2000 ); RefreshRates ();}
       if (error || err > 5 ) return ;
   }
}
//-------------------------------------------------------------------+
 
Tigerfreerun :
Bu işlevin tam olarak ne yaptığını gerçekten anlamıyorum. Ancak yazarın dediği gibi, görev, semboller arasında kârlı olmayan siparişleri kârlı olanlarla kapatmaktır. işlevi düzeltmeme ve anlamama yardım ederseniz sevinirim
 void MaxMinProfit()
{
int i, N, MaxTic, MinTic;
double    MinProf= 0 , MaxProf= 0 , OP, g, a[][ 2 ] ;
string MinSym, MaxSym;
ArrayResize (a, 0 );
 
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) 
  {     
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) 
    { 
     if ( OrderType ()== OP_SELL ||   OrderType ()== OP_BUY )
      {
       OP = NormalizeDouble ( OrderProfit ()+ OrderSwap ()+ OrderCommission (), 2 );
       
       if (MinProf>OP) 
      {
       
          MinProf=OP;
          MinTic= OrderTicket ();
          MinSym= OrderSymbol ();
          
         }
         
       if (OP> 0 ) 
      {
       
          N++;
             ArrayResize (a, N);
            a[N- 1 ][ 0 ]=OP;
            a[N- 1 ][ 1 ]= OrderTicket ();
          
         }
         
         }
         }
         
         }
         
       ArraySort (a, WHOLE_ARRAY , 0 , MODE_DESCEND ); //MODE_ASCEND);
      
       for (i= 0 ; i<Level; i++) 
       {
     
     g+=a[i][ 0 ];
     //int ti=a[i-2][1];
     }
         
         
     
     if (MinProf < 0 && (g+MinProf)>=ProcMax)
      {
       for (i= 0 ; i<Level; i++) 
       {
       if ( OrderSelect (a[i][ 1 ], SELECT_BY_TICKET , MODE_TRADES ))
        {
         //Alert(a[i][1]);
         if ( OrderType ()== OP_BUY )
         {
           OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( OrderSymbol (), MODE_BID ), Slip, CLR_NONE);
          }
           if ( OrderType ()== OP_SELL )
           {
           OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( OrderSymbol (), MODE_ASK ), Slip, CLR_NONE);
           }
          }
         }
          
          
          
           if ( OrderSelect (MinTic, SELECT_BY_TICKET , MODE_TRADES ))
        {
         if ( OrderType ()== OP_BUY )
         {
           OrderClose (MinTic, OrderLots (), MarketInfo ( OrderSymbol (), MODE_BID ), Slip, CLR_NONE);
          }
           if ( OrderType ()== OP_SELL )
           {
           OrderClose (MinTic, OrderLots (), MarketInfo ( OrderSymbol (), MODE_ASK ), Slip, CLR_NONE);
           }
          }}       
return ;
}

Siz anlamıyorsunuz ve ben de bu fonksiyonun ne yaptığını anlamak istemiyorum. Onu kullanmak için. Onu kendin için seçtin. Ne için olduğunu anlamadan bir şeyi nasıl kullanabilirsin?

Ben sadece hatanın nerede, hangi nedenle oluştuğunu söyledim.

Bir açıklama daha:

1. Bir dizi bildirildi. Kodda yeşil renkle vurgulanmıştır. Birinci boyutta sıfır uzunluk olduğu sürece. Maviyle vurgulanan satırın nedeni açık değil. Dizinin boyutunu sıfırlarsanız, bunun için ArrayFree() vardır.Fakat yeni bildirilen dinamik dizi sıfır uzunluğa sahip olduğundan bu işlev bile işe yaramaz.

2. Herhangi bir emir yoksa, kırmızı ile vurgulanan kod yürütülmeyecektir. Buna göre, dizinin boyutu sıfır kalacaktır.

3. Dizinin sıralaması her tik üzerinde sağlanır. Bu, koddan kaynaklanmaktadır... Ve boş bir cepte ne sıralanabilir??? 2 bıldırcın yumurtası mı...


Ve işte hatanın metni ... Peki, ne diyebilirim? Geliştiriciler, birinin boş bir diziyi sıralamaya çalışabileceğini öngörmedi. Bunun için özel bir mesaj yok.

ArrayFree - Операции с массивами - Справочник MQL4
ArrayFree - Операции с массивами - Справочник MQL4
  • docs.mql4.com
При написании скриптов и индикаторов необходимость в использовании функции ArrayFree() может возникнуть не часто: так как при завершении работы скрипта вся использованная память сразу же освобождается, а в пользовательских индикаторах основная работа с массивами представляет собою доступ к индикаторным буферам, размеры которых автоматически...
 
Alexey Viktorov :

Siz anlamıyorsunuz ve ben de bu fonksiyonun ne yaptığını anlamak istemiyorum. Onu kullanmak için. Onu kendin için seçtin. Ne için olduğunu anlamadan bir şeyi nasıl kullanabilirsin?

Ben sadece hatanın nerede, hangi nedenle oluştuğunu söyledim.

Bir açıklama daha:

1. Bir dizi bildirildi. Kodda yeşil renkle vurgulanmıştır. Birinci boyutta sıfır uzunluk olduğu sürece. Maviyle vurgulanan satırın nedeni açık değil. Dizinin boyutunu sıfırlarsanız, bunun için ArrayFree() vardır.Fakat yeni bildirilen dinamik dizi sıfır uzunluğa sahip olduğundan bu işlev bile işe yaramaz.

2. Herhangi bir emir yoksa, kırmızı ile vurgulanan kod yürütülmeyecektir. Buna göre, dizinin boyutu sıfır kalacaktır.

3. Dizinin sıralaması her tik üzerinde sağlanır. Bu, koddan kaynaklanmaktadır... Ve boş bir cepte ne sıralanabilir??? 2 bıldırcın yumurtası mı...


Ve işte hatanın metni ... Peki, ne diyebilirim? Geliştiriciler, birinin boş bir diziyi sıralamaya çalışabileceğini öngörmedi. Bunun için özel bir mesaj yok.

Alexis doğru değil. ArrayFree(), bu diziye artık ihtiyaç duyulmadığında bir diziden bellek boşaltmak için kullanılır, ki bu çok nadiren gereklidir ve bu durumda kesinlikle gerekli değildir.

Bir diziyi sıfırlamak için ZeroMemory(a), ArrayInitialize(a,xxx) kullanmanız ve ilk boyuttaki boyutu ArrayResize(a,xxx) değiştirmeniz gerekir.

Ancak, bu değişiklik muhakemenizin gidişatını etkilemez - bunlar doğrudur.

 
Artyom Trishkin :

Alexis doğru değil. ArrayFree(), bu diziye artık ihtiyaç duyulmadığında bir diziden bellek boşaltmak için kullanılır, ki bu çok nadiren gereklidir ve bu durumda kesinlikle gerekli değildir.

Bir diziyi sıfırlamak için ZeroMemory(a), ArrayInitialize(a,xxx) kullanmanız ve ilk boyuttaki boyutu ArrayResize(a,xxx) değiştirmeniz gerekir.

Ancak, bu değişiklik muhakemenizin gidişatını etkilemez - bunlar doğrudur.

belgelere göre

Dizi Ücretsiz

Herhangi bir dinamik dizinin arabelleğini serbest bırakır ve boş boyutun boyutunu 0 olarak ayarlar.

Belki kendimi yeterince iyi ifade edemedim ve sen beni yanlış anladın.
 
Alexey Viktorov :

belgelere göre

Belki kendimi yeterince iyi ifade edemedim ve sen beni yanlış anladın.

Ve daha sonra:


Not

Komut dosyaları ve göstergeler yazarken, ArrayFree() işlevini kullanma ihtiyacı genellikle ortaya çıkmayabilir: komut dosyası sona erdiğinde, kullanılan tüm bellek hemen serbest bırakılır ve özel göstergelerde, dizilerle yapılan ana çalışma, gösterge arabelleklerine erişimdir, boyutları, yürütme terminali alt sistemi tarafından otomatik olarak kontrol edilir.

Programın karmaşık dinamik koşullarda belleği bağımsız olarak yönetmesi gerekiyorsa, ArrayFree() işlevi, zaten gereksiz olan bir dinamik dizi tarafından işgal edilen belleği açıkça ve hemen serbest bırakmanıza olanak tanır.


Herhangi bir dinamik dizinin arabelleğini serbest bırakır ve boş boyutun boyutunu 0 olarak ayarlar

Anlamak? İkinci bölümü okudunuz, ancak ilk önemli bölümü kaçırdınız mı? Dizi için ayrılan belleği serbest bırakır. Hepsi bu ... hayır ... Dizi için ayrılan bellek alanı serbest bırakılır ve daha sonra başka veriler tarafından işgal edilebilir. Bu dizi altındaki belleği yeniden tahsis etmek için işlevdeki bir girişte her seferinde ne olur? Sonuçta, onu serbest bırakmayı teklif ediyorsun. Ve yalnızca boyutu değiştirmeniz gerekir - ArrayResize() veya diziyi sıfırlamanız - ArrayInitialize(), ZeroMemory(). Bu durumda, dizi için bellek alanı serbest bırakılmayacak ve program bitene kadar bu dizi için ayrılmış olarak kalacaktır.

 
Artyom Trishkin :

Ve daha sonra:


Not

Komut dosyaları ve göstergeler yazarken, ArrayFree() işlevini kullanma ihtiyacı genellikle ortaya çıkmayabilir: komut dosyası sona erdiğinde, kullanılan tüm bellek hemen serbest bırakılır ve özel göstergelerde, dizilerle yapılan ana çalışma, gösterge arabelleklerine erişimdir, boyutları, yürütme terminali alt sistemi tarafından otomatik olarak kontrol edilir.

Programın karmaşık dinamik koşullarda belleği bağımsız olarak yönetmesi gerekiyorsa, ArrayFree() işlevi, zaten gereksiz olan bir dinamik dizi tarafından işgal edilen belleği açıkça ve hemen serbest bırakmanıza olanak tanır.


Herhangi bir dinamik dizinin arabelleğini serbest bırakır ve boş boyutun boyutunu 0 olarak ayarlar

Anlamak? İkinci bölümü okudunuz, ancak ilk önemli bölümü kaçırdınız mı? Dizi için ayrılan belleği serbest bırakır. Hepsi bu ... hayır ... Dizi için ayrılan bellek alanı serbest bırakılır ve daha sonra başka veriler tarafından işgal edilebilir. Bu dizi altındaki belleği yeniden tahsis etmek için işlevdeki bir girişte her seferinde ne olur? Sonuçta, onu serbest bırakmayı teklif ediyorsun. Ve yalnızca boyutu değiştirmeniz gerekir - ArrayResize() veya diziyi sıfırlamanız - ArrayInitialize(), ZeroMemory(). Bu durumda, dizi için bellek alanı serbest bırakılmayacak ve program bitene kadar bu dizi için ayrılmış olarak kalacaktır.

Peki, peki... Ve eğer işleve yapılan her çağrıda veya en olası olmayanı, her onayda yerel bir dizi bildirilirse... dizi için bellek her dizi bildiriminde tahsis edilir. Değil mi? Ve hafızayı boşaltmak ya da boşaltmamak ne fark eder, ama her seferinde hafızayı yeniden tahsis etmek ...

Ana mesaj, bunu yapmanız gerekmediğiydi... ve yaparsanız, bunu ArrayFree() ile yapmak daha iyidir.

İlginç olan şudur: Bir işlev her çağrıldığında yerel bir dizi bildirilirse, her seferinde bunun için bellek ayrılır. Ve böylece hangi adresler kullanılıyor??? Dizinin ilk bildirimiyle aynı, yoksa ne olacak?

 
Denis Danilov :

Tünaydın! Expert Advisor'a roly-poly denir, ancak planlandığı gibi çalışmaz. lot kırmızıda kapanırsa ikiye katlanır, ancak müteakip TP kapanışı bir nedenden dolayı daha önce kapatılan negatif işlemlerin geri dönüşüne izin vermez. Bana neyin yanlış olduğunu söyle, çözemiyorum. Cevap veren herkese şimdiden teşekkürler.

İlk parti boyutundan daha önce ikiye katlamayı kontrol etmeye çalışın. Kapanış saatlerine bakın.