Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 983

 

Merhaba meslektaşlarım.

Soru şudur: mql4'te konum sayısını hesaplamak için bir fonksiyon yazmak mümkündü, örneğin,

 //+------------------------------------------------------------------+
// Счетчик ордеров
//+------------------------------------------------------------------+
int OrderCount( int type)
{
   int count = 0 ;
   for ( int trade = OrdersTotal () - 1 ; trade >= 0 ; trade--)
  {
     if ( OrderSelect (trade, SELECT_BY_POS , MODE_TRADES ))
    {
       if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic && OrderType () == type)
      count++;
    }
  }
   return (count);
}

Bu iş mql5'te nasıl uygulanır? Magick ile pozisyonları nasıl hesaplayabilirsiniz? yoksa türe göre mi?

 
Bu konuyla ilgili olmayan yorumlar " MQL4 MT4 MetaTrader 4 Yeni Başlayanlardan Sorular " bölümüne taşındı.
 
Nikita Chernyshov :

Merhaba meslektaşlarım.

Soru şudur: mql4'te konum sayısını hesaplamak için bir fonksiyon yazmak mümkündü, örneğin,

Bu iş mql5'te nasıl uygulanır? Magick ile pozisyonları nasıl hesaplayabilirsiniz? yoksa türe göre mi?

Ehlers_CG EA kodundaki örnek, CalculateAllPositions işlevi.

 
Vladimir Karputov :

Ehlers_CG EA kodundaki örnek, CalculateAllPositions işlevi.

Çok teşekkürler. Daha anlaşılır bir şekilde yeniden yapmaya çalıştım. Ama bu şekilde 0 veriyor ve sonsuz sayıda emir açıyor, bana nerede hata yaptığımı söyleyin? Sizden ticaret fikrine dikkat etmemenizi rica ediyorum, ben sadece genel gelişim içindeyim.


 #include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>

CPositionInfo  m_position;                   // trade position object
CTrade         trade;                       // trading object
CSymbolInfo    symbol_info;                     // symbol info object
CAccountInfo   m_account;                     // account info wrapper
CDealInfo      m_deal;                       // deals object
COrderInfo     m_order;                       // pending orders object
CMoneyFixedMargin *m_money;


input double lot = 0.01 ;
input int     TakeP = 300 ;
input int     StopL = 300 ;
input int     Magic = 123 ;
input int     Slip  = 50 ;

input int     MA    = 50 ;

double ma[];
int     handle;
int     digits;
double point;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   handle = iMA ( NULL , 0 ,MA, 0 , MODE_SMA , PRICE_CLOSE );
   
   trade.SetExpertMagicNumber(Magic);
   trade.SetDeviationInPoints(Slip);
   trade.SetTypeFilling( ORDER_FILLING_FOK );
   trade.SetAsyncMode( false );
   
   digits=( int ) SymbolInfoInteger ( NULL , SYMBOL_DIGITS );
   point= SymbolInfoDouble ( NULL , SYMBOL_POINT );
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   CopyBuffer (handle, 0 , 0 , 50 ,ma);
   ArraySetAsSeries (ma, true ); 
   
   double Ask = SymbolInfoDouble ( NULL , SYMBOL_ASK );
   double Bid = SymbolInfoDouble ( NULL , SYMBOL_BID );
   
   if ( Ask > ma[ 1 ] && CalculateAllPositions( POSITION_TYPE_BUY ) == 0 )
     {
       double tp = NormalizeDouble ( Ask +TakeP*point,digits);
       double sl = NormalizeDouble ( Ask -StopL*point,digits);
       
       if (!trade.Buy(lot, NULL , Ask ,sl,tp))
          {
       //--- сообщим о неудаче
       Print ( "Метод Buy() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
          } else
               {
                 Print ( "Метод Buy() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
                 " (" ,trade.ResultRetcodeDescription(), ")" );
               }
     }
     
   if ( Bid < ma[ 1 ] && CalculateAllPositions( POSITION_TYPE_SELL ) == 0 )
     {
       double tp = NormalizeDouble ( Bid -TakeP*point,digits);
       double sl = NormalizeDouble ( Bid +StopL*point,digits);
       
       if (!trade.Sell(lot, NULL , Bid ,sl,tp))
          {
       //--- сообщим о неудаче
       Print ( "Метод Sell() потерпел неудачу. Код возврата=" ,trade.ResultRetcode(),
             ". Описание кода: " ,trade.ResultRetcodeDescription());
          } else
               {
                 Print ( "Метод Sell() выполнен успешно. Код возврата=" ,trade.ResultRetcode(),
                 " (" ,trade.ResultRetcodeDescription(), ")" );
               }
     }     
   Comment (CalculateAllPositions( POSITION_TYPE_BUY ));
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Счетчик ордеров                                                  |
//+------------------------------------------------------------------+
int CalculateAllPositions( const ENUM_POSITION_TYPE type)
  {
   int count= 0 ;   
  
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--)
      {
       if (m_position.SelectByIndex(i)) 
        {
         if (m_position. Symbol ()== NULL && m_position.Magic()==Magic && m_position.PositionType()==type)
         count++;
       }
         
     }
     return (count);
  }
 
Nikita Chernyshov :

Çok teşekkürler. Daha anlaşılır bir şekilde yeniden yapmaya çalıştım . Ama bu şekilde 0 veriyor ve sonsuz sayıda emir açıyor, bana nerede hata yaptığımı söyleyin? Sizden ticaret fikrine dikkat etmemenizi rica ediyorum, ben sadece genel gelişim içindeyim.


Hatanızın anahtar kelimesi, Uzman Danışmanlarıma bu kadar çok doğrulama kodu yazmam boşuna değil. Neredeyse tüm dahili öğeleri ve özellikle OnTradeTransaction'ı attınız .

 

Bir sorunla karşılaştım, gösterge tabanlı EA gerçek bir hesapta doğru çalışıyor, ancak hem OHLC hem de tüm keneler için kene oluşturma modlarında test cihazında yatıyor - sonuç aynı. Hatanın sonucu, sıfır çubuğunda boş bir gösterge arabelleğidir (yalnızca üst TF'de göstergeyi hesaplamak için kullanılan yeni bir çubuk göründüğünde). Ancak, EA'ya Uyku ekleyerek göstergeyi saymayı başardım ve daha sonra, kene oluşturma moduna bağlı olarak, bu Uykunun farklı olması gerektiği ortaya çıktı - Uyku (15000) tüm kenelerde oluşturmak için yeterlidir ve Uyku (30000) OHLC için gereklidir).

Bu nedenle, Uyku ile durumun normal olup olmadığı sorusu ortaya çıkıyor, çünkü mantıksal olarak kene oluşturma moduna bağlı olarak farklı gecikme sürelerinin modellendiği ortaya çıkıyor!?

Sevgili geliştiriciler, nedenin ne olduğunu anlayamadığım için açıklanan durumu göstergeyle netleştirmenizi rica ediyorum - kodda veya test cihazında bir hata!

Gösterge ve danışman kişisel olarak sunmaya hazır, sadece kime söyle.

 
Aleksey Vyazmikin :

Bir sorunla karşılaştım, gösterge tabanlı EA gerçek bir hesapta doğru çalışıyor, ancak hem OHLC hem de tüm keneler için kene oluşturma modlarında test cihazında yatıyor - sonuç aynı. Hatanın sonucu, sıfır çubuğunda boş bir gösterge arabelleğidir (yalnızca üst TF'de göstergeyi hesaplamak için kullanılan yeni bir çubuk göründüğünde). Ancak, Uyku ekleyerek göstergeyi saymaya zorlamayı başardım ve ardından, kene oluşturma moduna bağlı olarak, bu Uykunun farklı olması gerektiği ortaya çıktı - Uyku(15000) tüm kenelerde oluşturmak için yeterlidir, Uyku(30000) ) OHLC için gereklidir.

Bu nedenle, Uyku ile durumun normal olup olmadığı sorusu ortaya çıkıyor, çünkü mantıksal olarak kene oluşturma moduna bağlı olarak farklı gecikme sürelerinin modellendiği ortaya çıkıyor!?

Sevgili geliştiriciler, nedenin ne olduğunu anlayamadığım için açıklanan durumu göstergeyle netleştirmenizi rica ediyorum - kodda veya test cihazında bir hata!

Gösterge ve danışman kişisel olarak sunmaya hazır, sadece kime söyle.

Göstergede uyku çalışmıyor. Üstelik söz konusu tester olunca Expert Advisor'da bile görmezden geliniyor.

 
Ihor Herasko :

Göstergede uyku çalışmıyor. Üstelik söz konusu tester olunca Expert Advisor'da bile görmezden geliniyor.

Bunu Uyku danışmanında zaten yazdım ve yoksayılırsa ve bundan% 100 eminseniz, bu, hatanın test cihazında olduğuna dair başka bir onaydır.

Gecikme zamanında oluşmayabilir, ancak program için taklit edilebilir.

Eklendi: Uyku test cihazında çalışıyor, bunu doğrulamak için basit bir kod burada

   Print ( iClose ( Symbol (), PERIOD_CURRENT , 0 ));
   Sleep ( 15000 );
   Print ( iClose ( Symbol (), PERIOD_CURRENT , 0 ));

Sonuç

 2019.01 . 22 08 : 28 : 24.661 2019.01 . 21 23 : 49 : 00    66920.0
2019.01 . 22 08 : 28 : 24.661 2019.01 . 21 23 : 49 : 15    66928.0
 
Ihor Herasko :

Göstergede uyku çalışmıyor. Üstelik söz konusu tester olunca Expert Advisor'da bile görmezden geliniyor .

Bu doğru değil.

 
Aleksey Vyazmikin :

Bunu Uyku danışmanına zaten yazdım ve yoksayılırsa ve bundan% 100 eminseniz, bu, hatanın test cihazında olduğuna dair başka bir onaydır.

Gecikme zamanında oluşmayabilir, ancak program için taklit edilebilir.

Eklendi: Uyku test cihazında çalışıyor, bunu doğrulamak için basit bir kod burada

Sonuç

Orijinal yayınınız şuydu:

Ancak Uyku ekleyerek göstergeyi saymayı başardım ve işte burada ortaya çıktı..

Bu yüzden göstergede Uyku'ya tepki verdim.

Sleep in the Expert Advisor'a gelince, 4 ve 5'te neden farklı davranışlara ihtiyaç duyulduğu net değil. 4-ke'de şöyle:

 void OnTick ()
{
   Print ( "Before: " , TimeCurrent ());
   Sleep ( 100000 );
   Print ( "After: " , TimeCurrent ());
}
2019.01 . 22 07 : 38 : 19.432 2018.11 . 08 00 : 02 : 05   Test AUDUSD,M5: After: 2018.11 . 08 00 : 02 : 05
2019.01 . 22 07 : 38 : 19.432 2018.11 . 08 00 : 02 : 05   Test AUDUSD,M5: Before: 2018.11 . 08 00 : 02 : 05
Aslına bakarsanız, soru. Uyku, göstergedeki verilerin yeniden hesaplanmasını hiçbir şekilde etkilememelidir. Tamponları doldurmada bir sorun var. Tekrarlanabilir bir kod parçası var mı?