記事"クロスプラットフォームEA: ストップ"についてのディスカッション - ページ 2

 

メインのストップロスを 変更したいのですが・・・。どうすればいいですか?

それをやっているんだ:

COrder *order=orders.At(i);

....

COrderStop *order_stop=order.MainStop();
double new_sl=...;
order_stop.StopLoss(new_sl);
order.MainStop(order_stop);
order.CheckStops();

それをやろうとして、本当に頭が壊れたよ...

Basic Principles - Trading Operations - MetaTrader 5 Help
Basic Principles - Trading Operations - MetaTrader 5 Help
  • www.metatrader5.com
Before you proceed to study the trade functions of the platform, you must have a clear understanding of the basic terms: order, deal and position...
 

COrderStopVirtualBase::Updateでチェックしている ため更新されない。

if(CheckPointer(m_objsl))
  {
   double sl_line=m_objsl.GetPrice();
   if(sl_line!=StopLoss())
      stoploss= sl_line;
  }

StopLoss()は新しい値を返しますが、sl_lineは古いままです。

 
Enrico Lambino:
こんにちは、シェップ、

ご指摘ありがとうございます。今まで気づかなかった。コードを更新します。

はい。これはやはり前方宣言によるものです。CStopはメソッド内でCOrderとCOrderStopのインスタンスを必要とします。CStopをコンパイルしようとした場合も同様です。お互いを必要とするこれらのクラスは、すべて一緒にコンパイルする必要がある。それぞれを単独でコンパイルするとエラーが発生する。例えば

これはコンパイルできない。前方宣言を宣言して、コンパイラがobject1クラス内のクラス・メンバm_object2を認識できるようにする必要があります:

これは、Object1とObject2が同じファイルにある場合は問題ありません。もし、Object1とObject2が別々のファイルにある場合は、Object1のクラス・ファイルにObject2の前方宣言を、Object2のクラス・ファイルにObject1の前方宣言を作成する必要があります。これは、2つのクラスのどちらかにメソッドを追加するまでは正しい。

現在のバージョンのコンパイラーは前方宣言を認識しますが、前方宣言されたクラスのリストされたメソッドは認識しません。そのため、"CStop - declaration without type "のようなエラー・メッセージは表示されませんが、上記のようなメソッドのコンパイラー・エラー・メッセージは表示されます。コンパイラはクラスを認識しますが、順方向に宣言されたクラスのメソッドは認識しません。


こんにちは、エンリコ、

素早い回答をありがとう。前方宣言については、その通りです。 前方宣言されたクラスを使用するオブジェクトが、そのクラスのメンバーについて何も知らないというのは理にかなっています。

私は自分の実行エンジンにストラテジー・パターンを使った別のモデルを使っているのですが、これにはいくつか厄介な問題があって、ちょうどあなたのライブラリを見ていたときに、そうした問題に出くわしました。

あなたの仕事は本当に素晴らしく、健全なデザインとエンジニアリングのスキルを持っています。

ありがとう、シェップ。

 
Shephard Mukachi:

エンリコ、こんにちは、

素早い回答をありがとう。前方宣言については、その通りです。 前方宣言されたクラスを使用するオブジェクトが、そのクラスのメンバーについて何も知らないというのは理にかなっています。

私は自分の実行エンジンにストラテジー・パターンを使った別のモデルを使っているのですが、これにはいくつか厄介な問題があって、ちょうどあなたのライブラリを見ていたときに、そうした問題に出くわしたのです。

あなたの仕事は本当に素晴らしく、健全なデザインとエンジニアリングのスキルを持っています。

ありがとう、シェップ。

こんにちは、シェップ、

どういたしまして、教えてくれてありがとう。前方宣言の問題にぶつかったとき、私も少し戸惑ったことを思い出したよ。

記事が役に立ったと聞いてうれしいよ。あなた自身のEAエンジンを構築する努力が報われることを祈っている。

ありがとう、エンリコ

 
mbjen:

COrderStopVirtualBase::Updateでチェックしているため更新されない。

StopLoss()は新しい値を返しますが、sl_lineは古いままです。

COrderStopVirtualBase::Updateの目的は、実はあなたの意図とは逆です。これは、通常EAの外部から(チャート上でドラッグしたり、オブジェクトのプロパティウィンドウで 直接値を変更したり)、自身のストップラインが更新されたときにsl/tp値を調整するためのものです。仮想ストップには、代わりに MoveStopLoss() と MoveTakeProfit() メソッドを使用してください。

これは次の記事のためのものですが、熱心な方は COrderStopBase の CheckTrailing() メソッドを見てみるとよいでしょう。このメソッドは、トレーリングの対象となるオーダー・ストップを変更する。このメソッドは、3つのタイプすべてに適用されます:

bool COrderStopBase::CheckTrailing(void)
  {
   if(!CheckPointer(m_stop) || m_order.IsClosed() || m_order.IsSuspended() || 
      (m_stoploss_closed && m_takeprofit_closed))
      return false;
   double stoploss=0,takeprofit=0;
   string symbol=m_order.Symbol();
   ENUM_ORDER_TYPE type=m_order.OrderType();
   double price=m_order.Price();
   double sl = StopLoss();
   double tp = TakeProfit();
   if(!m_stoploss_closed)
      stoploss=m_stop.CheckTrailing(symbol,type,price,sl,TRAIL_TARGET_STOPLOSS);
   if(!m_takeprofit_closed)
      takeprofit=m_stop.CheckTrailing(symbol,type,price,tp,TRAIL_TARGET_TAKEPROFIT);
   if(!IsStopLossValid(stoploss))
      stoploss=0;
   if(!IsTakeProfitValid(takeprofit))
      takeprofit=0;
   return Modify(stoploss,takeprofit); //<---- this
  }

また、CTrail クラスは、オーダー・ストップのインスタンスを取得することなく sl/tp レベルを変更するために使用することもできます (トレイリングやブレークイーブンのためだけではありません)。

 

提案されているクロスプラットフォーム・アプローチは、実践と利便性からいかにかけ離れているか。それ自身の面倒な自転車としては問題ない。しかし、なぜそれを公開するのか!このモンスターを勉強して使いこなすより、初心者でも完全に自分ですべてを書く方が簡単だ。理解できない。

MT5下のSBは、この記事のサイクルに比べればエレガンスの見本だ。しかもMT4にも移植されている

Готовые советники из Мастера MQL5 работают в MetaTrader 4
Готовые советники из Мастера MQL5 работают в MetaTrader 4
  • 2017.03.09
  • Stanislav Korotky
  • www.mql5.com
Клиентские терминалы MetaTrader 4 и MetaTrader 5 предоставляют своим пользователям возможность легко создавать прототипы программ на языке MQL с помощью встроенного Мастера (MQL Wizard). Мастера обоих версий терминалов очень похожи, но все же имеют одно важное отличие. В Мастере MetaTrader 5 есть пункт генерации готовых советников, а в...
 

この記事は本当に面白かった。ぜひフォローアップ記事を書いてください。このツールを使ってスキャルピングにどうアプローチするのか、とても興味があります。

この記事と他のすべての仕事に100万ドルありがとう。

 
fxsaber:

提案されているクロスプラットフォーム・アプローチは、実践と利便性からいかにかけ離れているか。それ自身の面倒な自転車としては問題ない。しかし、なぜそれを公開するのか!このモンスターを勉強して使いこなすより、初心者でも完全に自分ですべてを書く方が簡単だ。理解できない。

MT5のSBは、この記事のサイクルに比べれば、エレガンスの見本だ。しかもMT4に移植されている

まったく同感だ。OOPに精通していても、この著者のアプローチはあまりに変態的だ。過剰な部分が多すぎるし、コードはまったくコードではなく「モンスター」だ......。