記事"EAの元のコードを変更することなく、テイクプロフィットの代わりにリミットオーダーを使用する"についてのディスカッション - ページ 6

 
スタック・ オーバーフロー>エラーが出ます!問題はライブラリ・ファイルにある:
<LimitTakeProfit.mqh>です。
どなたか、何が悪かったのか分かりましたか?
 

読者の皆さん、こんにちは!

スタック・ オーバーフロー」のエラーにつまずいた人はいますか?

問題は "LimitTakeProfit.mqh "ライブラリにあると思います!

 

こんにちは、ドミトリー、


興味深い記事をありがとうございます!


以下の各行(54, 55, 56行目)のエラー "paramter passed as reference, variable expected "について教えてください。


CSymbolInfo CLimitTakeProfit::c_Symbol = new CSymbolInfo();

CArrayLong CLimitTakeProfit::i_TakeProfit = new CArrayLong();

CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


ありがとう!

 
Mario Marconi CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


ありがとう!

こんにちは。

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>
 
Dmitriy Gizlyk #:

こんにちは。

こんにちは、ドミトリー、

以下の行は、あなたの「LimitTakeProfit.mqh」に正確に書かれています:

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>

より正確には、このようなエラーは 、あなたのEA " MACD Sample LImitTP.mq5 " のコンパイル時に発生します


ご回答ありがとうございました!

 
Mario Marconi #:

やあ、ドミトリー、

あなたの "LimitTakeProfit.mqh "には次のような行があります:

より正確には、このようなエラーは 、あなたのEA " MACD Sample LImitTP.mq5 " のコンパイル時に発生します


ご回答ありがとうございました!

こんにちは、あなたはpaprameterの前に*を追加する必要があります。

CSymbolInfo    * CLimitTakeProfit::c_Symbol       =  new CSymbolInfo();
CArrayLong     * CLimitTakeProfit::i_TakeProfit   =  new CArrayLong();
CArrayDouble   * CLimitTakeProfit::d_TakeProfit   =  new CArrayDouble();
 
Dmitriy Gizlyk #:

こんにちは、あなたはpaprameterの前に*を追加する必要があります。

こんにちは、ドミトリー、


同じ3行で次のようなエラーが出ます:

- parameter passed as reference, variable expected LimitTakeProfit.mqh 54 57

- redefinition; different type modifiers LimitTakeProfit.mqh 54 35


ご回答ありがとうございました

 

こんにちは、ドミトリー、

この記事が少し前に発表されたことは知っていますが、お礼を言いたくて投稿しました!とても役に立ちますし、あなたの説明は実に明快で、クラスは魅力的に機能します。ありがとう!

投稿されたコードに小さなバグを見つけました。SetTakeProfits関数の途中で、次の行を見つけました:

switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))

これはすべてのTPを通るループの中にあります。問題は、ループの後半でCheckLimitOrder関数が呼び出され、その関数がCheckOrderInHistory関数を呼び出し、そこで別のポジションが選択される可能性があることです。つまり、ループの次の繰り返しでは、上記のコードにある「スイッチ」が異なる可能性があるということです。

これを解決するには、ループが始まる前にposition_typeを 変数に格納しておくべきだと思います。このように:

bool CLimitTakeProfit::SetTakeProfits(ulong position_ticket, double new_tp=0)

// (...)

   double position_volume=PositionGetDouble(POSITION_VOLUME);

//********** 次の行を追加
   ENUM_POSITION_TYPE position_type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
//****************************

   double closed=0;
   double closed_perc=0;
   double fix_closed_per=0;
//---
   for(int i=0;i<total;i++)
     {
      tp_request.comment="TP"+IntegerToString(i)+"_"+IntegerToString(position_ticket);
      if(i_TakeProfit.At(i)<tp_int && d_TakeProfit.At(i)>0)
        {
         if(closed>=100 || fix_closed_per>=100)
            break;
//---
         double lot=position_volume*MathMin(d_TakeProfit.At(i),100-closed_perc)/(100-fix_closed_per);
         lot=MathMin(position_volume-closed,lot);
         lot=c_Symbol.LotsMin()+MathMax(0,NormalizeDouble((lot-c_Symbol.LotsMin())/c_Symbol.LotsStep(),0)*c_Symbol.LotsStep());
         lot=NormalizeDouble(lot,2);
         tp_request.volume=lot;

//********** 次の行を修正する
         //switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))
         switch(position_type)
//*******************************
           {
            case POSITION_TYPE_BUY:
              tp_request.type=ORDER_TYPE_SELL_LIMIT;
              tp_request.price=c_Symbol.NormalizePrice(open_price+i_TakeProfit.At(i)*c_Symbol.Point());

// (...)

ご理解いただけたでしょうか?素晴らしい仕事をありがとう!

 

皆さん、こんにちは!

無効な有効期限]の問題があるのですが、どなたか直し方をご存じですか?

 

こんにちは。

LimitTakeProfitでEAをテストしたところ、以下のエラーメッセージが返ってきました。

取引要求構造と共に 有効期限を追加してみましたが、効果がありません。

どなたか助けてください。

モデレーターによる機械翻訳