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

 

Önceki soruya eklemeye karar verdim.

1)

Diyelim ki bir sinyalim var - yayılmanın keskin bir şekilde genişlemesi (haberlerde)

tüm cari işlemleri kapat

Ancak haberlerde, emirlerin bu şekilde kapanmasına veya açılmasına izin verilmeyecek.

yani bir komut alırsanız, OrderClose'u bir döngüye koyalım + Sleep (3000) ve kapanana kadar çalıştıralım

2)

butonda bir dahili değişkeni ve basılan/basılan değeri emir açma ihtimaline bağlarsanız gerçek zamanlı olarak çalışır mı?

 
trader781 :

Önceki soruya eklemeye karar verdim.

1)

Diyelim ki bir sinyalim var - yayılmanın keskin bir şekilde genişlemesiyle (haberlerde)

tüm cari işlemleri kapat

Ancak haberlerde, emirlerin bu şekilde kapanmasına veya açılmasına izin verilmeyecek.

yani bir komut alırsanız, OrderClose'u bir döngüye koyalım + Sleep (3000) ve kapanana kadar çalıştıralım

2)

butonda bir dahili değişkeni ve basılan/basılan değeri emir açma ihtimaline bağlarsanız gerçek zamanlı olarak çalışır mı?

1) Uyumama (3000) ve hata işlemeye yardımcı olur.
 

Selamlar, siparişlerin geçmişini grafik üzerine çizen bir gösterge yazıyorum , kod:

//+------------------------------------------------------------------+
//|                                                      history.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window

extern int         MagicNumber                = 1110 ;
extern datetime    HistoryOrdersFromDateTime  = 0 ;
extern color       SellColor                  = clrRed ;
extern color       BuyColor                   = clrBlue ;
extern color       ProfitColor                = clrWhite ;
extern bool        DeleteHistoryOrders        = false ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
  
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

void start()
{
   for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol () && OrderType ()<= 1 )
      {
         if (HistoryOrdersFromDateTime< OrderCloseTime ())
         {
             if (( TimeCurrent ()- OrderCloseTime ())> 60 )
               HistoryOrders();
         }
      }
   }
}

void HistoryOrders()
{
   double b= OrderOpenPrice (), d= OrderClosePrice (), lots= OrderLots (), Profit= 0 ;
   datetime a= OrderOpenTime (), c= OrderCloseTime (), close_time;
   string Ticket=( string ) OrderTicket (), type= "Sell" , symbol= OrderSymbol (), comment= OrderComment (), Background;
   color col=SellColor;
   if ( OrderType ()== 0 ) {col=BuyColor; type= "Buy" ;}

   if (DeleteHistoryOrders== false )
   {
       //Начальная точка
       ObjectCreate ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ "\n" +comment, OBJ_ARROW , 0 ,a,b);
       ObjectSet ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ "\n" +comment, OBJPROP_COLOR ,col);
       ObjectSet ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ "\n" +comment, OBJPROP_ARROWCODE , 1 );
      
       //Линия  
       ObjectCreate ( "#" +Ticket+ " " + DoubleToString (b, Digits )+ " -> " + DoubleToString (d, Digits ), OBJ_TREND , 0 ,a,b,c,d);
       ObjectSet ( "#" +Ticket+ " " + DoubleToString (b, Digits )+ " -> " + DoubleToString (d, Digits ), OBJPROP_COLOR ,col);
       ObjectSet ( "#" +Ticket+ " " + DoubleToString (b, Digits )+ " -> " + DoubleToString (d, Digits ), OBJPROP_WIDTH , 1 );
       ObjectSet ( "#" +Ticket+ " " + DoubleToString (b, Digits )+ " -> " + DoubleToString (d, Digits ), OBJPROP_STYLE , STYLE_DOT );
       ObjectSet ( "#" +Ticket+ " " + DoubleToString (b, Digits )+ " -> " + DoubleToString (d, Digits ), OBJPROP_RAY , 0 );
  
       //Конечная точка
       ObjectCreate ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ " close at " + DoubleToString (d, Digits ), OBJ_ARROW , 0 ,c,d);
       ObjectSet ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ " close at " + DoubleToString (d, Digits ), OBJPROP_COLOR ,col);
       ObjectSet ( "#" +Ticket+ " " +type+ " " + DoubleToString (lots, 2 )+ " " +symbol+ " at " + DoubleToString (b, Digits )+ " close at " + DoubleToString (d, Digits ), OBJPROP_ARROWCODE , 3 );

       //Расчет профита
       for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol () && OrderType ()<= 1 )
         {
            close_time= OrderCloseTime ();
             //60 секунд разницы между закрытием первого и последнего ордера в сетке
             if (c<=close_time+ 60 && c>=close_time- 60 )
            {
               Profit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
               Ticket=( string ) OrderTicket ();
            }  
         }      
      }
      
       //Размер фона  
       for ( int i= 2 ; i< StringLen ( DoubleToString (Profit, 2 )); i++)
         StringAdd (Background, "g" );
      
       //Фон профита
       ObjectCreate ( "#" +Ticket+ " Background" , OBJ_TEXT , 0 ,c,d);
       ObjectSet ( "#" +Ticket+ " Background" , OBJPROP_ANCHOR , ANCHOR_LOWER );
       ObjectSetText ( "#" +Ticket+ " Background" ,Background, 10 , "Webdings" ,col);
       ObjectSet ( "#" +Ticket+ " Background" , OBJPROP_PRICE1 ,d);
       ObjectSet ( "#" +Ticket+ " Background" , OBJPROP_TIME1 ,c+ Period ());
  
       //Профит
       ObjectCreate ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ), OBJ_TEXT , 0 ,c,d);
       ObjectSet ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ), OBJPROP_ANCHOR , ANCHOR_LOWER );
       ObjectSetText ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ), DoubleToString (Profit, 2 ), 10 , "Arial" ,ProfitColor);
       ObjectSet ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ), OBJPROP_PRICE1 ,d);
       ObjectSet ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ), OBJPROP_TIME1 ,c+ Period ());
   } else ObjectsDeleteAll ( 0 , "#" +Ticket+ " " );  
}

void OnDeinit ( const int reason)
{  
   //Удалаение истории ордеров
   for ( int i= 0 ; i< OrdersHistoryTotal (); i++)
   {
      DeleteHistoryOrders= true ;
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol ())
         HistoryOrders();
   }
}

Gösterge tek bir anlaşmayı doğru bir şekilde çizer (çizgi>arka plan>kar), ancak kapalı sipariş ızgaralarının gösteriminde küçük bir "cant" (ekran görüntüsü ekli) vardır, çizgiler arka planda ve kârda üst üste bindirilir (çizgi(1)>arka plan) >kâr>satır(2) >satır(3)>satır(4) . . . ).

Şu şekilde olmalıdır: (line(1)>line(2)>line(3)>line(4) . . . >background>kâr). Tefli çeşitli danslar başarıya yol açmadı, sonuçlanmasına yardımcı oldu.

Dosyalar:
 
ilnur17021992 :

Selamlar, siparişlerin geçmişini grafik üzerine çizen bir gösterge yazıyorum ,


Gösterge tek bir anlaşmayı doğru bir şekilde çizer (satır>arka plan>kar), ancak kapalı sipariş ızgaralarının görüntüsünde küçük bir "cant" (ekran görüntüsü ekli) vardır, çizgiler arka planda ve kârda üst üste bindirilir (satır(1)> arkaplan>kar>satır(2) >satır(3)>satır(4) . . . ).

Şu şekilde olmalıdır: (line(1)>line(2)>line(3)>line(4) . . . >background>kâr). Tefli çeşitli danslar başarıya yol açmadı, sonuçlanmasına yardımcı oldu.

OBJPROP_BACK özelliğini arka planda çizgilere ve simgelere atamayı deneyin.
ObjectSetInteger - Графические объекты - Справочник MQL4
ObjectSetInteger - Графические объекты - Справочник MQL4
  • docs.mql4.com
ObjectSetInteger - Графические объекты - Справочник MQL4
 
Alexey Viktorov :
OBJPROP_BACK özelliğini arka planda çizgilere ve simgelere atamayı deneyin.
Bir seçenek değil, bu yüzden çizgiler arka planda (mumların arkasında) olur, ancak çizimin mumların üstünde olması gerekir: mumlar>çizgiler>kar arka planı>kar
Dosyalar:
 
ilnur17021992 :
Bir seçenek değil, bu yüzden çizgiler arka planda (mumların arkasında) olur, ancak çizimin mumların üstünde olması gerekir: mumlar>çizgiler>kar arka planı>kar
Sonra sadece çizim sırası. Veya arka plan ve kar çizerken bu nesnelerin zamana göre varlığını kontrol edin , OBJ_TEXT nesnesindeki kar değerini okuyun ve mevcut siparişin karına ekleyin. Ardından arka planı silin ve kâr edin ve yeniden çizin.
Bu arada, bu sizi kar hesaplamak için ek bir döngüden kurtaracaktır.

Bu
       //Расчет профита
       for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol () && OrderType ()<= 1 )
         {
            close_time= OrderCloseTime ();
             //60 секунд разницы между закрытием первого и последнего ордера в сетке
             if (c<=close_time+ 60 && c>=close_time- 60 )
            {
               Profit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
               Ticket=( string ) OrderTicket ();
            }  
         }      
      }
ve kârı, sipariş parametrelerinin geri kalanıyla birlikte başlangıçta belirlersiniz.

ps lütfen. Bu düğmeyi kullanarak fotoğraf yayınlayın
 
Alexey Viktorov :
Sonra sadece çizim sırası. Veya arka plan ve kar çizerken bu nesnelerin zamana göre varlığını kontrol edin , OBJ_TEXT nesnesindeki kar değerini okuyun ve mevcut siparişin karına ekleyin. Ardından arka planı silin ve kâr edin ve yeniden çizin.
Bu arada, bu sizi kar hesaplamak için ek bir döngüden kurtaracaktır.
ve kârı, sipariş parametrelerinin geri kalanıyla birlikte başlangıçta belirlersiniz.

Böyle bir çizim dizisi nasıl ayarlanır, diyelim ki, önce onları birbirine bağlayan tüm noktaları ve çizgileri çizelim, sonra arka planı ve kârı çizmeye devam edelim?

 
ilnur17021992 :

Böyle bir çizim dizisi nasıl ayarlanır, diyelim ki, önce onları birbirine bağlayan tüm noktaları ve çizgileri çizelim, sonra arka planı ve kârı çizmeye devam edelim?

Eh, eğer ilk varsayımıma göre, o zaman evet. Ve sonra hemen bir doğaçlama parladı ve ilk cümleyi silmedim, ama ikincisini daha çok seviyorum.

Bu seçeneği düşünmek daha iyidir.

ObjectFind () daha sonra nesne bulunursa ObjectGetString () metinden sayıya transfer, alınan siparişe son siparişin karını ekleyin, eski OBJ_TEXT'i silin ve yeni bir tane çizin.
Bu, bu çubukta kapatılan ilk veya tek
siparişse, OBJ_TEXT basitçe çizilir ve bu kadar.
Ve adı basitleştirmek için bileti değil , barın açılış saatini ayarlayın. Yoksa daha fazla çalışma için bilet gerekli mi?

 
Alexey Viktorov :
Eh, eğer ilk varsayımıma göre, o zaman evet. Ve sonra hemen bir doğaçlama parladı ve ilk cümleyi silmedim, ama ikincisini daha çok seviyorum.

Bu seçeneği düşünmek daha iyidir.

ObjectFind () daha sonra nesne bulunursa ObjectGetString () metinden sayıya transfer, alınan siparişe son siparişin karını ekler, eski OBJ_TEXT'i siler ve yenisini çizeriz.
Bu, bu çubukta kapatılan ilk veya tek
siparişse, OBJ_TEXT basitçe çizilir ve bu kadar.
Ve adı basitleştirmek için bileti değil , barın açılış saatini ayarlayın. Yoksa daha fazla çalışma için bilet gerekli mi?

Evet, geçmişin sonraki analizi için bilet gereklidir. Yeniden çizimi zorladığınız için teşekkürler. Aşağıdaki kontrolü ekleyerek ve koda yeniden çizerek sorunu biraz daha kolay çözdüm:

       //Расчет профита
       for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol () && OrderType ()<= 1 )
         {
            close_time= OrderCloseTime ();
             //60 секунд разницы между закрытием первого и последнего ордера в сетке
             if (c<=close_time+ 60 && c>=close_time- 60 )
            {
               Profit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
               ProfitTicket=( string ) OrderTicket ();
               CountOrders++;
            }  
         }      
      }
      
       //Перерисовка фона и профита
       if ( CountOrders > 1 )
      {  
         ObjectDelete ( "#" +Ticket+ " Background" );
         ObjectDelete ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ));
         Ticket=ProfitTicket;      
      }

Bunun ne kadar doğru olduğunu bilmiyorum ama prensipte olması gerektiği gibi çiziyor (çizgiler> arka plan> kâr):

 
ilnur17021992 :

Evet, geçmişin sonraki analizi için bilet gereklidir. Aşağıdaki kontrolü ekleyerek ve koda yeniden çizerek sorunu biraz daha kolay çözdüm:

       //Расчет профита
       for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ) && OrderMagicNumber ()==MagicNumber && OrderSymbol ()== Symbol () && OrderType ()<= 1 )
         {
            close_time= OrderCloseTime ();
             //60 секунд разницы между закрытием первого и последнего ордера в сетке
             if (c<=close_time+ 60 && c>=close_time- 60 )
            {
               Profit+= OrderProfit ()+ OrderCommission ()+ OrderSwap ();
               ProfitTicket=( string ) OrderTicket ();
               CountOrders++;
            }  
         }      
      }
      
       //Перерисовка фона и профита
       if ( CountOrders > 1 )
      {  
         ObjectDelete ( "#" +Ticket+ " Background" );
         ObjectDelete ( "#" +Ticket+ " Profit: " + DoubleToString (Profit, 2 ));
         Ticket=ProfitTicket;      
      }

Prensip olarak doğru çizer (çizgiler> arka plan> kâr):

Bu harika, senin adına sevindim.