初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 983

 

こんにちは、同僚たち。

質問:mql4で、ポジション数を 計算するためには、次のような関数を書けばよいのです。

//+------------------------------------------------------------------+
// Счетчик ордеров
//+------------------------------------------------------------------+
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);
}

mql5ではどのように実装されているのですか?マジコン別、またはタイプ別のポジション数を計算するにはどうすればよいですか?

 
このトピックに関連しないコメントは、「MQL4 MT4 MetaTrader 4初心者からの質問」に移動しました。
 
Nikita Chernyshov:

こんにちは、同僚たち。

質問:mql4で、ポジション数を 計算するためには、次のような関数を書けばよいのです。

mql5ではどのように実装されているのですか?マジックナンバーや型式でポジション数を計算するにはどうしたらいいのでしょうか?

Ehlers_CG EA コード、関数CalculateAllPositionsでの例。

 
Vladimir Karputov:

Ehlers_CG EA コード、関数CalculateAllPositionsでの例。

ありがとうございました。よりわかりやすい形に変えてみた。しかし、それは0を返し、無限の注文を開く、私はどこで失敗したのか、アドバイスをお願いします。自分のトレーディングアイデアに注目するのではなく、あくまで一般的に学びたい。


#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:

ありがとうございました。より納得のいく形に変えてみた。しかし、それは0を返し、無限の注文を開く、私はどこで失敗したのか、アドバイスをお願いします。私のトレーディングの考え方に注意を払わないでください。


あなたの間違いのキーワードは、私は無駄に多くの検証コードをEAに書いていない、ということです。ほぼすべての内部構造、特にOnTradeTransactionが 省かれていますね。

 

問題が発生しました。インジケータベースのEAは実際の口座では正常に動作しますが、テスターではOHLCによるティック生成モードと すべてのティックによるティック生成モードの両方で、結果は同じです。エラーの結果は、ゼロバーでインジケータのバッファが空になります(インジケータの計算に使用される上位TFに新しいバーがある場合のみ)。しかし、Expert AdvisorにSleepを追加することで、なんとか指標を計算させることができました。 しかし、ティックの生成モードによって、このSleepが異なることがわかりました。すべてのティックからの生成にはSleep(15000)で十分で、OHLCにはSleep(30000)が必要なのです。

というのも、論理的には、ティック生成のモードによって異なる遅延時間がモデル化されているように見えるからです。

開発者の皆さん、インジケータの状況を説明してください。私自身、原因が何なのか理解できません。

インジケータとExpert AdvisorをPMに渡す用意があるが、誰に渡すか教えてくれ。

 
Aleksey Vyazmikin:

ある問題に直面しました。インジケータベースのEAは実際の口座では正常に動作しますが、テスターではOHLCによるティック生成モードと すべてのティックによるティック生成モードの両方で、結果は同じです。エラーの結果は、ゼロバーでインジケータのバッファが空になります(インジケータの計算に使用される上位TFに新しいバーがある場合のみ)。しかし、Sleepを追加して計算するようにしたところ、ティック生成のモードによってこのSleepが異なること、つまり、すべてのティックから生成する場合はSleep(15000)で十分だが、OHLCの場合はSleep(30000)が必要なことが判明したのです。

というのも、論理的には、ティック生成のモードによって異なる遅延時間がモデル化されているように見えるからです。

開発者の皆様、インジケーターの状況を説明してください。私自身、原因が何なのか理解できません。

PMでインジケータとEAを渡す用意があるが、誰に渡すか教えてくれ。

このインジケーターでは、スリープは機能しません。しかも、テスターならともかく、Expert Advisorでは無視される。

 
Ihor Herasko:

インジケーターにスリープが効かない。しかも、テスターならともかく、Expert Advisorでは無視される。

SleepはExpert Advisorにあると既に書きましたが、それを無視して100%間違いないのであれば、余計にテスターにエラーがあることを確認することになりますね。

遅延は時間的に発生しないかもしれませんが、プログラムに対してエミュレートすることは可能です。

追記: テスターでSleepが 動作することを確認した簡単なコードを掲載します。

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

結果

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:

インジケーターにスリープが効かない。しかも、テスターになるとEAでも無視 される。

そうではありません。

 
Aleksey Vyazmikin:

SleepはEAにあると既に書きましたが、それを無視して100%間違いないのであれば、余計にテスターにエラーがあることを確認することになります。

遅延は時間的に発生しないかもしれませんが、プログラムに対してエミュレートすることは可能です。

追記:テスターでSleepが動作することを確認した簡単なコードを掲載します。

結果

これはもともと、あなたの投稿にあったものです。

しかし、Sleepを入れることでなんとかインジケータが読めるようになり、ここで判明したのが...。

だから、Sleep in the indicatorに反応したんです。

また、EAのSleepについてですが、なぜ4と5で挙動を変える必要があったのかがわかりません。 4では、あのような感じです。

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
質問の事実についてはスリープは、インジケーターのデータの再計算には影響しないはずです。バッファの充填がおかしい。もしかしたら、再現性のあるコードがあるのでは?
理由: