より少ないコード、より多くのアクション...EAを書く - ページ 4

 
Maxim Kuznetsov:
次のステップについての投稿を削除したのはなぜですか?

その傲慢さをぜひ試してみてください。そして、リソースのルールを読むこと。

みなさんは、フォーラムの書き込みや、こどバズの説明文に書き込むことができます。

 
Maxim Kuznetsov:
次のステップについての投稿を削除したのはなぜですか?

投稿を見たが、何も犯罪的なことは書いてないぞ。私の見方が甘かったようです。

 
Maxim Kuznetsov:

バランスが悪くなるのは当然。 2本のMAがクロスする」ことに何を期待しているのか?


EAに別の根拠を持たせることができる - MAは最良の選択肢とは程遠いものです。

 
aleger:

EAのベースは別のものでもよいのですが......マシキは、ベストな選択肢とは程遠いですね。

もう少し注意深く見ると、すでにかなりのものが実装できていることに気づくはずです :-)

そこで、次のようなことが判明しました。

* アプリケーションプログラマ(ライブラリユーザ)は、彼/彼女がいくつかの列(使用例では、これらはFAST_MA、SLOW_MA、SIGNAL_BUY、SIGNAL_SELLです)でマイクロExcelを持っていると宣言しました。

* そして、個々のセルを計算する方法を知っている関数をスケッチしました。例ではiMAに言及した。

* 同時に、彼はこのテーブルの他のセルに自由にアクセスすることができます(DataFrameは、可能であればシーケンスを破壊します)。

* そして、別途、ユーザーが "行の値をチェックして、取引する時期が来たら "という関数を書きました。

明らかに、これだけでEAが取引を開始することができます。そして、戦略は非常に柔軟に変更することができます。テーブルの計算として考えられることは、何でも可能です。
もう一つは、これは最初の半歩に過ぎないということです :-) 今のところ、EAはモンキーシフターのように、最小ロットで、一つのシンボルと一つのタイムフレームからだけ取引しています。

 

最初の2つのパートでは、一般的に「猿」または「シグナルによるフリップ」と表現される、最もシンプルな戦略を実行できるExpert Advisorを手に入れました。
信号自体は非常にシンプルにプログラムされており、ほとんどExcelのようなものです :-)

そろそろExpert Advisorをもう少し教えてください。せめてStopLoss入れてトラブれよ。

ストラテジーの芸術的な説明に「ストップロスは距離STOPLOSS_POINTSに置き、フラクタルでトレールする」というフレーズを補足してください。また、上記のユースケースの変更点を紹介します。

  • 新規EAパラメータ入力 int STOPLOSS_POINTS=100;
  • ENUM_SERIESにUPPER_FRACTAL,LOWER_FRACTALの2つの計算フィールドを追加しました。
  • を計算し、GetData関数に2つの "case: "を追加してください。

という関数(EAクラスのメソッド)を提供し、EAを 設定する。最もシンプルなエントリーは、次のように見ることができます。

SetStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL)を設定します。

は、「指定した距離にストップロスを設定し、LOWER_FRACTAL列で買い、UPPER_FRACTAL列で売る」というもので、わかりやすい名前と構文になっていると思うのですが、いかがでしょうか。

仮にユーザーが多くのジェスチャーをした場合(入力を宣言し、2つの列を追加し、機能設定を呼び出す)、彼の行動が期待通りの結果につながるようにライブラリを開発します。また、表形式の計算を開発し、メッセージ/イベント機構の基礎を築く必要があります。

コピーペーストの際、余計なコメントやMQL5のコードを削除し、コンパクトにまとめました。

input ENUM_APPLIED_PRICE FAST_MA_PRICE=PRICE_CLOSE;
input ENUM_MA_METHOD FAST_MA_METHOD=MODE_EMA;
input int FAST_MA_PERIOD=14;
input int FAST_MA_SHIFT=0;

input ENUM_APPLIED_PRICE SLOW_MA_PRICE=PRICE_CLOSE;
input ENUM_MA_METHOD SLOW_MA_METHOD=MODE_SMA;
input int SLOW_MA_PERIOD=54;
input int SLOW_MA_SHIFT=0;

// начальные значения StopLoss, TakeProfit
input int STOPLOSS_POINTS=100;
input int TAKEPROFIT_POINTS=200;

#include "EA/EA.mqh"

enum ENUM_SERIES {
   FAST_MA,       // id. значений FAST_MA
   SLOW_MA,       // id. значений SLOW_MA 
   SIGNAL_BUY,    // сигнал к покупкам
   SIGNAL_SELL,   // сигнал к продажам
   UPPER_FRACTAL,       // верхний фрактал (для трала стопов ордеров sell)
   LOWER_FRACTAL, // нижний фрактал
   TOTAL_SERIES   // последний элемент перечисления = кол-во элементов
};

double GetData(EA *ea,int id,int shift,DataFrame *table)
{
   switch ((ENUM_SERIES)id) {
      case FAST_MA:
         return table[FAST_MA][shift]=iMA(ea.Symbol,ea.Period,FAST_MA_PERIOD,0,FAST_MA_METHOD,FAST_MA_PRICE,shift);
      case SLOW_MA:
         return table[SLOW_MA][shift]=iMA(ea.Symbol,ea.Period,SLOW_MA_PERIOD,0,SLOW_MA_METHOD,SLOW_MA_PRICE,shift);
      case SIGNAL_BUY:
         return table[SIGNAL_BUY][shift]=table.CrossedUp(FAST_MA,SLOW_MA,shift);
      break;
      case SIGNAL_SELL:
         return table[SIGNAL_SELL][shift]=table.CrossedDn(FAST_MA,SLOW_MA,shift);
      break;
      // Расчёт уровней трала
      case UPPER_FRACTAL:
         // верхний фрактал. уровень по которому тралятся sell
         return table[UPPER_FRACTAL][shift]=iFractal(ea.Symbol,ea.Period,MODE_UPPER,shift+2);
      case LOWER_FRACTAL:
         return table[UPPER_FRACTAL][shift]=iFractal(ea.Symbol,ea.Period,MODE_LOWER,shift+2);
   }
   return EMPTY_VALUE;
}
int SignalOfCross(EA *ea,int shift,DataFrame *data)
{
   if (FAST_MA_PRICE!=PRICE_OPEN || SLOW_MA_PRICE!=PRICE_OPEN) shift++;
   if (data[SIGNAL_BUY][shift]==1.0)  return OP_BUY;
   if (data[SIGNAL_SELL][shift]==1.0) return OP_SELL;
   return -1;
}
EA *ea=NULL;

int OnInit()
{
   ea = new EA();
   ea.SetupTimeframe(_Symbol,_Period,TOTAL_SERIES,30,GetData);
   ea.SetupSignal(SignalOfCross);

        // укажем начальный стоп-лосс ордеров и уровни для тралов 
   ea.SetupStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL);
   // и заодно тейк-профит
   ea.SetupTakeProfit(TAKEPROFIT_POINTS);
   // остальная часть одинакова для всех советников
   //................
}
 
Maxim Kuznetsov:

もう、こうなるとコードを見るのもつらい。外見的にシンプルに書くというのは、難しいことです。簡潔であることは重要ですが、そうであっても、シンプルであることは簡単に逃げてしまいます。

あなたのコードに対する意見は、私の意見と同じで、非常に主観的なものです。外から見ている人は、複雑なのか単純なのか、ずっと客観的に判断できます。

あなたのコードを観察する者として - 複雑です。

 
fxsaber:

もう、こうなるとコードを見るのもつらい。外見的にシンプルに書くというのは、難しいことです。簡潔であることは重要ですが、そうであっても、シンプルであることは簡単に逃げてしまいます。

あなたのコードに対する意見は、私の意見と同じように、非常に主観的なものです。外から見ている人は、複雑なのか単純なのか、ずっと客観的に判断できます。

あなたのコードを観察する者として - 複雑です。

ユースケースだけに、より明確で簡潔なエントリーを提案する。あるいは、現在のものに編集を加える。

これが最も難しい点で、ほとんどの場合、議論のために提供されるものです。




 
Maxim Kuznetsov:

ユースケースだけに、より明瞭で簡潔な表記を提案されています。あるいは、現在のものに編集を加える。

これが最も難しい点であり、まさに議論のために提案されることがほとんどである。

なぜ必要なのか、わからないし理解もできないので、提案しない。MQL4は、外部の人間から見れば、MQL4よりシンプルになることはほとんどないでしょう。MQL4の開発者は、シンプルなアーキテクチャに見事にたどり着きました。

 

何を得たいのか?正直なところ、よくわからない。最初はラフレームワークが意図されているのかと思いましたが、そうではなく、指標、注文、意思決定の標準的なアルゴリズムなどのラッパークラスは何もありません。もっと読みやすいのは、fast.Get(2)>=slow.Get(1);という構成ですが(あくまで例として)、宣言があります。

CMA fast=new CMA(NULL,0,12,...);

CMA slow=new CMA(NULL,0,100,...);

それは、IMHOであるあなたがその場で足踏みしている間に、議論できることです。

 
fxsaber:

あなたのコードを観察する者として - 難しい。

そうですね、言語がわかっていても、自分のコードを読むのはとても難しいです。