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

 
Andrey Sokolov terminal kapatıldığında veya gösterge yeniden başlatıldığında görüntülenir.
İlki hariç 2 ekran görüntüsü hareket etmiyor, 5019 hatası (dosya yok), klasörde görüntülenmelerine rağmen (zamanlayıcı tarafından yapılan ilki hariç).


Piyasa kapalı ve zamanlayıcı test cihazında çalışmıyor.
 
Andrey Sokolov terminal kapatıldığında veya gösterge yeniden başlatıldığında görüntülenir.
İlki hariç 2 ekran görüntüsü hareket etmiyor, 5019 hatası (dosya yok), klasörde görüntülenmelerine rağmen (zamanlayıcı tarafından yapılan ilki hariç).


Kript üzerindeki tüm ekran görüntülerini kontrol ettim, ancak bir hareket hatası var

 2021.10 . 03 15 : 23 : 56.384 Scrin BTCUSD,M5: screen name_file 2021.10 . 03 15 - 23 - 56 .png
2021.10 . 03 15 : 23 : 56.367 Scrin BTCUSD,M5: FileMove ERR: 4051
2021.10 . 03 15 : 23 : 56.367 Scrin BTCUSD,M5: OnTimer () 
2021.10 . 03 15 : 23 : 51.391 Scrin BTCUSD,M5: screen name_file 2021.10 . 03 15 - 23 - 51 .png
2021.10 . 03 15 : 23 : 51.374 Scrin BTCUSD,M5: FileMove ERR: 4051
2021.10 . 03 15 : 23 : 51.374 Scrin BTCUSD,M5: OnTimer () 
2021.10 . 03 15 : 23 : 46.378 Scrin BTCUSD,M5: screen name_file 2021.10 . 03 15 - 23 - 46 .png
2021.10 . 03 15 : 23 : 46.360 Scrin BTCUSD,M5: FileMove ERR: 4051
2021.10 . 03 15 : 23 : 46.360 Scrin BTCUSD,M5: OnTimer () 
 
MakarFX # :

Kript üzerindeki tüm ekran görüntülerini kontrol ettim, ancak bir hareket hatası var

İşte böyle çalışır

 //+------------------------------------------------------------------+
bool Move(){
   string src_path=name_file; 
   string dst_path=name_folder+ "//" +name_file; 
   ResetLastError ();
   if ( FileMove (src_path, 0 ,dst_path, 0 )){
       Print ( "FileMove OK " );
       return true ;
   }   
   else {
       string err_text= "FileMove ERR: " +( string ) GetLastError ();
       if ( GetLastError ()== 5019 ) err_text+=( "  5019 name_file " +name_file);
       Print (err_text);
   }  
   return false ;
}
Ve neden hareket etmekle uğraşasınız ki?
 
MakarFX # :

Gezinmeyi kolaylaştırmak için işlevleri ayırın

İşte bir OnTick() örneği

Gördüğünüz gibi burada sadece fonksiyon çağrıları var.

İyi günler Makar, kodu yeniden tasarladı, hata günlüğünde ortalama fiyat hesaplama işlevini getirdi, ancak ortalama fiyattan trol yok

 //+----------------------------------------------------------------------------+
//| Расчет среденй цены                                                        |
//+----------------------------------------------------------------------------+
double GetAveragePrice()
{
   order_lots = 0 ;
   price = 0 ;
   {
     for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
    {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
       {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
         {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL)
           {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots();
            avg_price = NormalizeDouble (price / order_lots, Digits );
             {
               ObjectDelete ( 0 , "AveragePriceLine" );
               ObjectCreate ( 0 , "AveragePriceLine" , OBJ_HLINE , 0 , 0 , avg_price);
               ObjectSet( "AveragePriceLine" , OBJPROP_COLOR , Magenta);
             }
           }
         }
       }
    }
   }
return (avg_price);
}
//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders( int otype)
{
     for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
    {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
       {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic && OrderType() == otype)
          {
           if (otype == OP_BUY) tp = NormalizeDouble (GetAveragePrice() + TakeProfitGroupOrder* Point , Digits );
           if (otype == OP_SELL) tp = NormalizeDouble (GetAveragePrice() - TakeProfitGroupOrder* Point , Digits );
           if ((otype == OP_BUY || otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero)) 
           tp = NormalizeDouble (GetAveragePrice(), Digits );
          }
       }
    }
     for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--) 
    {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
       {
           if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic && OrderType() == otype)
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), 0 , tp, 0 ))
                   Print ( "Ордера успешно модифицированы!" );
                 else Print ( "Ошибка модификации ордеров!" );
                TrailingGroupOrder();
           }
       }
    }
}
//+----------------------------------------------------------------------------+
//| Трейлинг стоп групповых ордеров                                            |
//+----------------------------------------------------------------------------+
void TrailingGroupOrder()
{
     for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
    {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
       {
       if (OrderType() == OP_BUY && Bid - GetAveragePrice() > TrailingStopGroupOrder* Point )
        {
         if (Bid - GetAveragePrice() > TrailingStopGroupOrder* Point || OrderStopLoss() == 0 )
         {
         if (OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder )* Point || OrderStopLoss() == 0 )
          {
           if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble (Bid - TrailingStopGroupOrder* Point , Digits ), tp, 0 ))
                     Print ( "Ошибка модификации групповых ордеров на покупку!" );
          }
         }
        }
         if (OrderType() == OP_SELL && GetAveragePrice() - Ask > TrailingStopGroupOrder* Point )
         {
         if (GetAveragePrice() - Ask > TrailingStopGroupOrder* Point || OrderStopLoss() == 0 )
           {
             if (OrderStopLoss() > Ask + (TrailingStep + TrailingStopGroupOrder)* Point || OrderStopLoss() == 0 )
              {
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble (Ask + TrailingStopGroupOrder* Point , Digits ), tp, 0 ))
                     Print ( "Ошибка модификации групповых ордеров на продажу!" );
              }
           }
         }
      } 
    }
}

Kusursuz çalışan tekli siparişler için bu fonksiyondan takip prensibini aldım.

 //+----------------------------------------------------------------------------+
//| Трейлинг стоп одиночных ордеров                                            |
//+----------------------------------------------------------------------------+
void Trailing()
{
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
         {
           if (OrderType() == OP_BUY && Bid - OrderOpenPrice() > TrailingStopFirstOrder* Point )
           {
             if (Bid - OrderOpenPrice() > TrailingStopFirstOrder* Point || OrderStopLoss() == 0 )
             {
                 if (OrderStopLoss() < Bid - (TrailingStep + TrailingStopFirstOrder)* Point || OrderStopLoss() == 0 )
                {
                   if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble (Bid - TrailingStopFirstOrder* Point , Digits ), tp, 0 ))
                     Print ( "Ошибка модификации ордера на покупку!" );
                }
             }
           }
           if (OrderType() == OP_SELL && OrderOpenPrice() - Ask > TrailingStopFirstOrder* Point )
           {
             if (OrderOpenPrice() - Ask > TrailingStopFirstOrder* Point || OrderStopLoss() == 0 )
             {
                 if (OrderStopLoss() > Ask + (TrailingStep + TrailingStopFirstOrder)* Point || OrderStopLoss() == 0 )
               {
                   if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble (Ask + TrailingStopFirstOrder* Point , Digits ), tp, 0 ))
                     Print ( "Ошибка модификации ордера на продажу!" );
               }
             }
           }
         }
      }
   }
}
 
EVGENII SHELIPOV # :

İyi günler Makar, kodu yeniden tasarladı, hata günlüğünde ortalama fiyat hesaplama işlevini getirdi, ancak ortalama fiyattan trol yok

Kusursuz çalışan tekli siparişler için bu fonksiyondan takip prensibini aldım.

Aşağı yukarı böyle...

 //+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
   {
//---
   if (CountTrade()> 1 ) TrailingGroupOrder();
   }
//+----------------------------------------------------------------------------+
//| Расчет среденй цены                                                        |
//+----------------------------------------------------------------------------+
double GetAveragePrice()
   {
   order_lots = 0 ;
   price = 0 ;
      {
       for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
         {
         if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
            {
             if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  price += OrderOpenPrice() * OrderLots();
                  order_lots += OrderLots();
                  avg_price = NormalizeDouble (price / order_lots, Digits );

                   ObjectDelete ( 0 , "AveragePriceLine" );
                   ObjectCreate ( 0 , "AveragePriceLine" , OBJ_HLINE , 0 , 0 , avg_price);
                  ObjectSet( "AveragePriceLine" , OBJPROP_COLOR , Magenta);
                  }
               }
            }
         }
      }
   return (avg_price);
   }
//+----------------------------------------------------------------------------+
//| Трейлинг стоп групповых ордеров                                            |
//+----------------------------------------------------------------------------+
void TrailingGroupOrder()
   {
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
      {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderType() == OP_BUY)
            {
             if (Bid - GetAveragePrice() > TrailingStopGroupOrder* Point || OrderStopLoss() == 0 )
               {
               if (OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder )* Point || OrderStopLoss() == 0 )
                  {
                   if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble (Bid - TrailingStopGroupOrder* Point , Digits ), tp, 0 ))
                     Print ( "Ошибка модификации групповых ордеров на покупку!" );
                  }
               }
            }
         if (OrderType() == OP_SELL)
            {
             if (GetAveragePrice() - Ask > TrailingStopGroupOrder* Point || OrderStopLoss() == 0 )
               {
               if (OrderStopLoss() > Ask + (TrailingStep + TrailingStopGroupOrder)* Point || OrderStopLoss() == 0 )
                  {
                   if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble (Ask + TrailingStopGroupOrder* Point , Digits ), tp, 0 ))
                     Print ( "Ошибка модификации групповых ордеров на продажу!" );
                  }
               }
            }
         } 
      }
   }
//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders( int otype)
   {
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
      {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic && OrderType() == otype)
            {
             if (otype == OP_BUY)
               {
               tp = NormalizeDouble (GetAveragePrice() + TakeProfitGroupOrder* Point , Digits );
               if (OrderModify(OrderTicket(), OrderOpenPrice(), 0 , tp, 0 ))
                   Print ( "Ордера успешно модифицированы!" );
               else Print ( "Ошибка модификации ордеров!" );
               }
             if (otype == OP_SELL)
               {
               tp = NormalizeDouble (GetAveragePrice() - TakeProfitGroupOrder* Point , Digits );
               if (OrderModify(OrderTicket(), OrderOpenPrice(), 0 , tp, 0 ))
                   Print ( "Ордера успешно модифицированы!" );
               else Print ( "Ошибка модификации ордеров!" );
               }
            }
         }
      }
   }

İşlevleri düzelttim - gereksizleri kaldırdım
 
MakarFX # :

İşte böyle çalışır

doğru çalışıyor mu? Bu seçenekle ilgili tüm sorunlarım var. Ve bu mt5

 
MakarFX # :
Ve neden hareket etmekle uğraşasınız ki?

sıralama için

 
Andrey Sokolov # :

sıralama için

Ayrıca sıralar, ancak ekstra özellikler olmadan

 #property strict
#property indicator_chart_window
#property indicator_plots 0

enum ENUM_FULL_MANUAL { full, //весь график
            manual, //указанный
            };
input int timer= 5 ; //время на шаг в секундах
input ENUM_FULL_MANUAL skr_mode=full; //размер скриншота   
input int width = 640 ; // ширина 
input int height = 320 ; // высота 
input string format = ".png" ;

ENUM_ALIGN_MODE align_mode= ALIGN_RIGHT ; // тип выравнивания

string name_folder, name_file;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
{
EventSetTimer (timer);
Print ( "OnInit()" );
name_folder= Symbol ()+ "  " +StringPeriod();
ScreenShot();

return ( INIT_SUCCEEDED );
}
//===================================================================
void OnDeinit ( const int reason)
{
EventKillTimer ();
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
             const int prev_calculated,
             const datetime &time[],
             const double &open[],
             const double &high[],
             const double &low[],
             const double &close[],
             const long &tick_volume[],
             const long &volume[],
             const int &spread[])
{
//---

//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
{
   Print ( "OnTimer() " );
   ScreenShot();
}
//+------------------------------------------------------------------+
bool ScreenShot(){   
   name_file= TimeToString ( TimeLocal (), TIME_DATE | TIME_SECONDS )+format;
   StringReplace (name_file, ":" , "-" );
   if (skr_mode==full){
       if ( ChartScreenShot ( 0 , name_folder+ "//" +name_file, ( int ) ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS , 0 )
      , ( int ) ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS , 0 ), ALIGN_RIGHT )){
         Print ( "screen name_file " , name_file);
         return true ;
      }
       else {
         Print ( "screen ERR: " , GetLastError ());
      }   
   }   
   if (skr_mode==manual){
       if ( ChartScreenShot ( 0 , name_file, width, height, align_mode)){
         return true ;
      }
   }      
   return false ;  
}
string StringPeriod(){
   if ( Period ()== 1 ) return "M1" ;
   if ( Period ()== 2 ) return "M2" ;
   if ( Period ()== 3 ) return "M3" ;
   if ( Period ()== 4 ) return "M4" ;
   if ( Period ()== 5 ) return "M5" ;
   if ( Period ()== 6 ) return "M6" ;
   if ( Period ()== 10 ) return "M10" ;
   if ( Period ()== 12 ) return "M12" ;
   if ( Period ()== 15 ) return "M15" ;
   if ( Period ()== 20 ) return "M20" ;
   if ( Period ()== 30 ) return "M30" ;
   if ( Period ()== 16385 ) return "H1" ;
   if ( Period ()== 16386 ) return "H2" ;
   if ( Period ()== 16387 ) return "H3" ;
   if ( Period ()== 16388 ) return "H4" ;
   if ( Period ()== 16390 ) return "H6" ;
   if ( Period ()== 16392 ) return "H8" ;
   if ( Period ()== 16396 ) return "H12" ;
   if ( Period ()== 16408 ) return "Daily" ;
   if ( Period ()== 32769 ) return "Weekly" ;
   if ( Period ()== 49153 ) return "Monthly" ;
   return "ERROR" ;
}
 
Andrey Sokolov # :

doğru çalışıyor mu? Bu seçenekle ilgili tüm sorunlarım var. Ve bu mt5

pardon 4 yazdım...

5'te kontrol edildi! Her şey çalışıyor.

 2021.10 . 03 17 : 55 : 54.192 Scrin (BTCUSD,M5)       OnTimer () 
2021.10 . 03 17 : 55 : 54.195 Scrin (BTCUSD,M5)       screen name_file 2021.10 . 03 17 - 55 - 54 .png
2021.10 . 03 17 : 55 : 59.211 Scrin (BTCUSD,M5)       OnTimer () 
2021.10 . 03 17 : 55 : 59.213 Scrin (BTCUSD,M5)       screen name_file 2021.10 . 03 17 - 55 - 59 .png
2021.10 . 03 17 : 56 : 04.214 Scrin (BTCUSD,M5)       OnTimer () 
2021.10 . 03 17 : 56 : 04.217 Scrin (BTCUSD,M5)       screen name_file 2021.10 . 03 17 - 56 - 04 .png
2021.10 . 03 17 : 56 : 09.204 Scrin (BTCUSD,M5)       OnTimer () 
2021.10 . 03 17 : 56 : 09.236 Scrin (BTCUSD,M5)       screen name_file 2021.10 . 03 17 - 56 - 09 .png
2021.10 . 03 17 : 56 : 14.202 Scrin (BTCUSD,M5)       OnTimer () 
2021.10 . 03 17 : 56 : 14.205 Scrin (BTCUSD,M5)       screen name_file 2021.10 . 03 17 - 56 - 14 .png
Dosyalar:
Scrin.mq5  8 kb
 
MakarFX # :

Aşağı yukarı böyle...

İşlevleri düzelttim - gereksizleri kaldırdım

Makar, kodda hangi yerden fonksiyona referans olacağını açıklayabilir misin?

 //+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders( int otype)
{
     for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
    {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
       {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic && OrderType() == otype)
          {
           if (otype == OP_BUY) tp = NormalizeDouble (GetAveragePrice() + TakeProfitGroupOrder* Point , Digits );
           if (otype == OP_SELL) tp = NormalizeDouble (GetAveragePrice() - TakeProfitGroupOrder* Point , Digits );
           if ((otype == OP_BUY || otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero)) 
           tp = NormalizeDouble (GetAveragePrice(), Digits );
          }
       }
    }
     for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--) 
    {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
       {
           if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic && OrderType() == otype)
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), 0 , tp, 0 ))
                   Print ( "Ордера успешно модифицированы!" );
                 else Print ( "Ошибка модификации ордеров!" );
                TrailingGroupOrder();
           }
       }
    }
}