
一般的なトレーディングシステムを基にしたExpert Advisor と売買ロボット最適化の錬金術(パート7)
はじめに
MetaQuotes Software Corp. は2008年7月1日に「自動売買チャンピオンシップ 2008 」の参加者登録を開始しました。私にとって、そのような好機を逃がし、「自動売買チャンピオンシップ 2008 のルール」を正式に満たし、コンテスト中、失格の理由となる重大なエラーを認めない EA の構築理論を表現する記事のシリーズを継続しないのは、筋の通らないことです。
このイベントを実現するために、ポジションオープンのもっとも簡単なアルゴリズムを使っているのはごく当然です。そのトレード要因は本稿のコンテキストではあまり興味深いとは言えませんが。同時に、もっとも初歩的でささいなことが検索調査についてもっとも重要になる可能性があります。というのも、後にチャンピオンシップへの参加を数年繰り上げることができるからです。
EA プログラミングの一般的考え
われわれの場合、トレードサーバーとの連携で実際に正しい動作を行う構造の細かい表記を持つ Expert Advisor の概略を述べるのが一番の実証になる、と私は思います。「チャンピオンシップのルール」はオープンポジション数と出される未決注文数は同時に3件と定めています。よって、ポジションごとに1戦略、1件の EA に3つの戦略を使うのが妥当でしょう。
ロングポジションとショートポジションのオープンには異なるパラメータを持つ同一アルゴリズムを使用します。同時に、これらアルゴリズムが一度に1ポジションだけオープンすることでそれらに同一マジックナンバーを割り当てる必要があります。そのため、市場エンターにはアルゴリズム6つとマジックナンバーは3つだけです。参入アルゴリズムとして、私は本シリーズの一番最初の記事 にある移動平均方向変化に基づくトレーディングシステムを使います。アルゴリズムを互いに異なるものとするため、私はそこで別の移動平均を使います。
Expert Advisor コード
以下は EA コードの1バージョンです。
//+==================================================================+ //| Exp_16_Champ.mq4 | //| Copyright © 2008, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+==================================================================+ #property copyright "Copyright © 2008, Nikolay Kositsin" #property link "farria@mail.redcom.ru" //----+ +-----------------------------------------------------------------------+ //---- EXPERT ADVISOR'S INPUTS FOR BUY TRADES extern bool Test_Up1 = true;//a filter for trades calculation direction extern int Timeframe_Up1 = 60; extern double Money_Management_Up1 = 0.1; extern int Length_Up1 = 4; // smoothing depth extern int Phase_Up1 = 100; // parameter ranging within //-100 ... +100, it affects the quality of the transient process; extern int IPC_Up1 = 0;/* Choosing prices to calculate the indicator on (0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 14-Heiken Ashi Close.) */ extern int STOPLOSS_Up1 = 50; // StopLoss extern int TAKEPROFIT_Up1 = 100; // TakeProfit extern bool ClosePos_Up1 = true; // enable forcible closing the position //----+ +-----------------------------------------------------------------------+ //---- EXPERT ADVISOR'S INPUTS FOR SELL TRADES extern bool Test_Dn1 = true;//a filter for trades calculation direction extern int Timeframe_Dn1 = 60; extern double Money_Management_Dn1 = 0.1; extern int Length_Dn1 = 4; // smoothing depth extern int Phase_Dn1 = 100; // parameter ranging within // -100 ... +100, it affects the quality of the transient process; extern int IPC_Dn1 = 0;/* Choosing prices to calculate the indicator on (0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 14-Heiken Ashi Close.) */ extern int STOPLOSS_Dn1 = 50; // StopLoss extern int TAKEPROFIT_Dn1 = 100; // TakeProfit extern bool ClosePos_Dn1 = true; // enable forcible closing the position //----+ +-----------------------------------------------------------------------+ //---- EXPERT ADVISOR'S INPUTS FOR BUY TRADES extern bool Test_Up2 = true;//a filter for trades calculation direction extern int Timeframe_Up2 = 60; extern double Money_Management_Up2 = 0.1; extern int Length1_Up2 = 4; // first smoothing depth extern int Phase1_Up2 = 100; // parameter of the first smoothing, //ranging within -100 ... +100, it affects the quality //of the averaging transient; extern int Length2_Up2 = 4; // second smoothing depth extern int Phase2_Up2 = 100; // parameter of the second smoothing, //ranging within -100 ... +100, it affects the quality //of the averaging transient; extern int IPC_Up2 = 0;/* Choosing prices to calculate the indicator on(0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 14-Heiken Ashi Close.) */ extern int STOPLOSS_Up2 = 50; // StopLoss extern int TAKEPROFIT_Up2 = 100; // TakeProfit extern bool ClosePos_Up2 = true; // enable forcible closing the position //----+ +-----------------------------------------------------------------------+ //---- EXPERT ADVISOR'S INPUTS FOR SELL TRADES extern bool Test_Dn2 = true;//a filter for trades calculation direction extern int Timeframe_Dn2 = 60; extern double Money_Management_Dn2 = 0.1; extern int Length1_Dn2 = 4; // smoothing depth extern int Phase1_Dn2 = 100; // parameter of the first smoothing, //ranging within -100 ... +100, it affects the quality //of the averaging transient; extern int Length2_Dn2 = 4; // smoothing depth extern int Phase2_Dn2 = 100; // parameter of the second smoothing, //ranging within -100 ... +100, it affects the quality //of the averaging transient; extern int IPC_Dn2 = 0;/* Choosing prices to calculate the indicator on(0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 14-Heiken Ashi Close.) */ extern int STOPLOSS_Dn2 = 50; // StopLoss extern int TAKEPROFIT_Dn2 = 100; // TakeProfit extern bool ClosePos_Dn2 = true; // enable forcible closing the position //----+ +-----------------------------------------------------------------------+ //---- EXPERT ADVISOR'S INPUTS FOR BUY TRADES extern bool Test_Up3 = true;//a filter for trades calculation direction extern int Timeframe_Up3 = 60; extern double Money_Management_Up3 = 0.1; extern int Period_Up3 = 10; // LSMA period extern int Length_Up3 = 4; // smoothing depth extern int Phase_Up3 = 100; // parameter of smoothing, //ranging within -100 ... +100, it affects the quality //of the averaging transient; extern int IPC_Up3 = 0;/* Choosing prices to calculate the indicator on(0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 14-Heiken Ashi Close.) */ extern int STOPLOSS_Up3 = 50; // StopLoss extern int TAKEPROFIT_Up3 = 100; // TakeProfit extern bool ClosePos_Up3 = true; // enable forcible closing the position //----+ +-----------------------------------------------------------------------+ //---- EXPERT ADVISOR'S INPUTS FOR SELL TRADES extern bool Test_Dn3 = true;//a filter for trades calculation direction extern int Timeframe_Dn3 = 60; extern double Money_Management_Dn3 = 0.1; extern int Period_Dn3 = 10; // LSMA period extern int Length_Dn3 = 4; // smoothing depth extern int Phase_Dn3 = 100; // parameter smoothing, //ranging within -100 ... +100, it affects the quality //of the averaging transient; extern int IPC_Dn3 = 0;/* Choosing prices to calculate the indicator on(0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW, 11-Heiken Ashi Low, 12-Heiken Ashi High, 13-Heiken Ashi Open, 14-Heiken Ashi Close.) */ extern int STOPLOSS_Dn3 = 50; // StopLoss extern int TAKEPROFIT_Dn3 = 100; // TakeProfit extern bool ClosePos_Dn3 = true; // enable forcible closing the position //----+ +-----------------------------------------------------------------------+ //---- Integer variables for the minimum of estimated bars int MinBar_Up1, MinBar_Up2, MinBar_Up3; int MinBar_Dn1, MinBar_Dn2, MinBar_Dn3; //+==================================================================+ //| Custom Expert functions | //+==================================================================+ #include <Lite_EXPERT_Champ.mqh> //+==================================================================+ //| TimeframeCheck() functions | //+==================================================================+ void TimeframeCheck(string Name, int Timeframe) { //----+ //---- Checking the value of the 'Timeframe' variable for correctness if (Timeframe != 1) if (Timeframe != 5) if (Timeframe != 15) if (Timeframe != 30) if (Timeframe != 60) if (Timeframe != 240) if (Timeframe != 1440) Print(StringConcatenate("Parameter",Name, " cannot ", "be equal to", Timeframe, "!!!")); //----+ } //+==================================================================+ //| Custom Expert initialization function | //+==================================================================+ int init() { //---- Checking the values of short-position timeframe variables for correctness TimeframeCheck("Timeframe_Up1", Timeframe_Up1); TimeframeCheck("Timeframe_Up2", Timeframe_Up2); TimeframeCheck("Timeframe_Up3", Timeframe_Up3); //---- Checking the values of long-position timeframe variables for correctness TimeframeCheck("Timeframe_Dn1", Timeframe_Dn1); TimeframeCheck("Timeframe_Dn2", Timeframe_Dn2); TimeframeCheck("Timeframe_Dn3", Timeframe_Dn3); //---- Initialization of variables MinBar_Up1 = 4 + 39 + 30; MinBar_Up2 = 4 + 30; MinBar_Up3 = 4 + Period_Up3 + 30; MinBar_Dn1 = 4 + 39 + 30; MinBar_Dn2 = 4 + 30; MinBar_Dn3 = 4 + Period_Dn3 + 30; //---- initialization complete return(0); } //+==================================================================+ //| expert deinitialization function | //+==================================================================+ int deinit() { //----+ //---- Expert Advisor initialization complete return(0); //----+ } //+==================================================================+ //| Custom Expert iteration function | //+==================================================================+ int start() { //----+ Declaration of local variables int bar; double Mov[3], dMov12, dMov23; //----+ Declaration of static variables static int LastBars_Up1, LastBars_Dn1; static int LastBars_Up2, LastBars_Dn2; static int LastBars_Up3, LastBars_Dn3; static bool BUY_Sign1, BUY_Stop1, SELL_Sign1, SELL_Stop1; static bool BUY_Sign2, BUY_Stop2, SELL_Sign2, SELL_Stop2; static bool BUY_Sign3, BUY_Stop3, SELL_Sign3, SELL_Stop3; //+------------------------------------------------------------------------+ //----++ CODE FOR LONG POSITIONS if (Test_Up1) { int IBARS_Up1 = iBars(NULL, Timeframe_Up1); if (IBARS_Up1 >= MinBar_Up1) { if (LastBars_Up1 != IBARS_Up1) { //----+ Initialization of variables BUY_Sign1 = false; BUY_Stop1 = false; LastBars_Up1 = IBARS_Up1; //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS for(bar = 1; bar <= 3; bar++) Mov[bar - 1]= iCustom(NULL, Timeframe_Up1, "JFatl", Length_Up1, Phase_Up1, 0, IPC_Up1, 0, bar); //----+ DETERMINING SIGNALS FOR TRADES dMov12 = Mov[0] - Mov[1]; dMov23 = Mov[1] - Mov[2]; if (dMov23 < 0) if (dMov12 > 0) BUY_Sign1 = true; if (dMov12 < 0) BUY_Stop1 = true; } //----+ MAKING TRADES if (!OpenBuyOrder_Ch(BUY_Sign1, 1, Money_Management_Up1, STOPLOSS_Up1, TAKEPROFIT_Up1)) return(-1); if (ClosePos_Up1) if (!CloseOrder_Ch(BUY_Stop1, 1)) return(-1); } } //----++ CODE FOR SHORT POSITIONS if (Test_Dn1) { int IBARS_Dn1 = iBars(NULL, Timeframe_Dn1); if (IBARS_Dn1 >= MinBar_Dn1) { if (LastBars_Dn1 != IBARS_Dn1) { //----+ Initialization of variables SELL_Sign1 = false; SELL_Stop1 = false; LastBars_Dn1 = IBARS_Dn1; //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS for(bar = 1; bar <= 3; bar++) Mov[bar - 1]= iCustom(NULL, Timeframe_Dn1, "JFatl", Length_Dn1, Phase_Dn1, 0, IPC_Dn1, 0, bar); //----+ DETERMINING SIGNALS FOR TRADES dMov12 = Mov[0] - Mov[1]; dMov23 = Mov[1] - Mov[2]; if (dMov23 > 0) if (dMov12 < 0) SELL_Sign1 = true; if (dMov12 > 0) SELL_Stop1 = true; } //----+ MAKING TRADES if (!OpenSellOrder_Ch(SELL_Sign1, 1, Money_Management_Dn1, STOPLOSS_Dn1, TAKEPROFIT_Dn1)) return(-1); if (ClosePos_Dn1) if (!CloseOrder_Ch(SELL_Stop1, 1)) return(-1); } } //+------------------------------------------------------------------------+ //----++ CODE FOR LONG POSITIONS if (Test_Up2) { int IBARS_Up2 = iBars(NULL, Timeframe_Up2); if (IBARS_Up2 >= MinBar_Up2) { if (LastBars_Up2 != IBARS_Up2) { //----+ Initialization of variables BUY_Sign2 = false; BUY_Stop2 = false; LastBars_Up2 = IBARS_Up2; //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS for(bar = 1; bar <= 3; bar++) Mov[bar - 1]= iCustom(NULL, Timeframe_Up2, "J2JMA", Length1_Up2, Length2_Up2, Phase1_Up2, Phase2_Up2, 0, IPC_Up2, 0, bar); //----+ DETERMINING SIGNALS FOR TRADES dMov12 = Mov[0] - Mov[1]; dMov23 = Mov[1] - Mov[2]; if (dMov23 < 0) if (dMov12 > 0) BUY_Sign2 = true; if (dMov12 < 0) BUY_Stop2 = true; } //----+ MAKING TRADES if (!OpenBuyOrder_Ch(BUY_Sign2, 2, Money_Management_Up2, STOPLOSS_Up2, TAKEPROFIT_Up2)) return(-1); if (ClosePos_Up2) if (!CloseOrder_Ch(BUY_Stop2, 2)) return(-1); } } //----++ CODE FOR SHORT POSITIONS if (Test_Dn2) { int IBARS_Dn2 = iBars(NULL, Timeframe_Dn2); if (IBARS_Dn2 >= MinBar_Dn2) { if (LastBars_Dn2 != IBARS_Dn2) { //----+ Initialization of variables SELL_Sign2 = false; SELL_Stop2 = false; LastBars_Dn2 = IBARS_Dn2; //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS for(bar = 1; bar <= 3; bar++) Mov[bar - 1]= iCustom(NULL, Timeframe_Dn2, "J2JMA", Length1_Dn2, Length2_Dn2, Phase1_Dn2, Phase2_Dn2, 0, IPC_Dn2, 0, bar); //----+ DETERMINING SIGNALS FOR TRADES dMov12 = Mov[0] - Mov[1]; dMov23 = Mov[1] - Mov[2]; if (dMov23 > 0) if (dMov12 < 0) SELL_Sign2 = true; if (dMov12 > 0) SELL_Stop2 = true; } //----+ MAKING TRADES if (!OpenSellOrder_Ch(SELL_Sign2, 2, Money_Management_Dn2, STOPLOSS_Dn2, TAKEPROFIT_Dn2)) return(-1); if (ClosePos_Dn2) if (!CloseOrder_Ch(SELL_Stop2, 2)) return(-1); } } //+------------------------------------------------------------------------+ //----++ CODE FOR LONG POSITIONS if (Test_Up3) { int IBARS_Up3 = iBars(NULL, Timeframe_Up3); if (IBARS_Up3 >= MinBar_Up3) { if (LastBars_Up3 != IBARS_Up3) { //----+ Initialization of variables BUY_Sign3 = false; BUY_Stop3 = false; LastBars_Up3 = IBARS_Up3; //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS for(bar = 1; bar <= 3; bar++) Mov[bar - 1]= iCustom(NULL, Timeframe_Up3, "JLSMA", Period_Up3, Length_Up3, Phase_Up3, 0, IPC_Up3, 0, bar); //----+ DETERMINING SIGNALS FOR TRADES dMov12 = Mov[0] - Mov[1]; dMov23 = Mov[1] - Mov[2]; if (dMov23 < 0) if (dMov12 > 0) BUY_Sign3 = true; if (dMov12 < 0) BUY_Stop3 = true; } //----+ MAKING TRADES if (!OpenBuyOrder_Ch(BUY_Sign3, 3, Money_Management_Up3, STOPLOSS_Up3, TAKEPROFIT_Up3)) return(-1); if (ClosePos_Up3) if (!CloseOrder_Ch(BUY_Stop3, 3)) return(-1); } } //----++ CODE FOR SHORT POSITIONS if (Test_Dn3) { int IBARS_Dn3 = iBars(NULL, Timeframe_Dn3); if (IBARS_Dn3 >= MinBar_Dn3) { if (LastBars_Dn3 != IBARS_Dn3) { //----+ Initialization of variables SELL_Sign3 = false; SELL_Stop3 = false; LastBars_Dn3 = IBARS_Dn3; //----+ CALCULATING THE INDICATORS' VALUES AND LOADING THEM TO BUFFERS for(bar = 1; bar <= 3; bar++) Mov[bar - 1]= iCustom(NULL, Timeframe_Dn3, "JLSMA", Period_Dn3, Length_Dn3, Phase_Dn3, 0, IPC_Dn3, 0, bar); //----+ DETERMINING SIGNALS FOR TRADES dMov12 = Mov[0] - Mov[1]; dMov23 = Mov[1] - Mov[2]; if (dMov23 > 0) if (dMov12 < 0) SELL_Sign3 = true; if (dMov12 > 0) SELL_Stop3 = true; } //----+ MAKING TRADES if (!OpenSellOrder_Ch(SELL_Sign3, 3, Money_Management_Dn3, STOPLOSS_Dn3, TAKEPROFIT_Dn3)) return(-1); if (ClosePos_Dn3) if (!CloseOrder_Ch(SELL_Stop3, 3)) return(-1); } } //+------------------------------------------------------------------------+ //----+ return(0); } //+------------------------------------------------------------------+
「チャンピオンシップのルール」で述べられている制限のない EA を持ちたい方は Exp_16.mq4 に行きます。実際、特定の方法で互いに異なる3つのアルゴリズムの中にトレーディング戦略の多様性を見ることができます。一般的に、1 Expert Advisor にはひじょうに独立した自動売買戦略が3件あります。コードを書くとき、偶然の一致を避けるため各 ATS で変数名を変更しました。
トレードを行うには、ファイル Lite_EXPERT1.mqh にある関数と似た関数を使用しました。それらはファイル Lite_EXPERT_Champ.mqh によって表されています。チャンピオンシップの要件を満たすために、これら関数にはコード内に最低限の変更と修正が必要でした。他の参会者の EA のコードでそのような関数のコードを使うだけなら合法です。なぜなら、それらは EA の実行エレメントにすぎないからです。それはこれらエレメントを実際に制御する知的ファイルとは関係がないものです。
よって、これら関数の詳細すべてに入ったり、なにか似たものや独自のものを作成する特別な必要はありません。それらを使えるようになるためには、本シリーズの先行記事を読むだけで十分です。一般的には、EA で書かれたそのような関数を使用することは、開発中のチップや製造されている電子機器を用いるのと同様に効果的です。
以下にこれら関数作成中に配慮したことを簡単に説明します。
1. ポジションオープン用、未決注文を出すための関数はすべて、すでにオープンしているポジション数を検出し、未決注文を出し、その数が2を超えている場合は、なにもアクションを起こしません。
2. 関数OpenBuyOrder_Ch()、OpenSellOrder_Ch()、 OpenBuyLimitOrder_Ch()、OpenBuyStopOrder_Ch()、 OpenSellLimitOrder_Ch()、OpenSellStopOrder_Ch() がテイクプロフィットを出すオーダーの始値からの最小距離はつねにスキャルピングなものとして「チャンピオンシップのルール」で決められているものより大きくなります。ストップロスへの最小距離はトレードされているシンボル特性によって決められ、サーバーによって依頼されます。これはまた未決注文にも関連しています。ただし、未決注文は依頼価格よりも悪い価格で処理されることがあることに配慮が必要です。みなさんのテイクプロフィットはこの場合、スキャルピング戦略の「範囲」に入る可能性があります。そのため、スキャルピング戦略からは距離を置く方がよいでしょう。そうでなければ、かなりの差の数で(年末にかなり可能なものです)自分のEAが直接スキャルピング戦略に支配されていることに気づくのです。
テイクプロフィットが大きすぎると、EA はほとんどトレードを行わず、それも失格の原因になることをを思い出すことです。
3. オープンする予定の最小、最大のポジションサイズは、「チャンピオンシップルール」で決められている変更の最小ステップ同様、初期化される変数値を伴い、これら関数すべてに書き込まれています。よって、そのようなエラーはすでに回避されているのです。
4. ポジションをオープンする前に、サイズに対してデポジットに十分な資金があるかどうか、関数 OpenBuyOrder_Ch() および OpenSellOrder_Ch() はこのポジションサイズとポジション自体を確認し、許容値までロット数を減らします。この関数で作業する際、みなさんの EA は「無効なトレードボリュームです」というようなエラーからはいかなる場合にも守られています。残念ながら、この方法で未決注文のロットサイズを修正することはできません。未決注文が実行される時点で、デポジットの自由資産額を予測することは不可能だからです。EA のプログラマーは、特にストップロスの大きな値に対しては、関数 OpenBuyLimitOrder_Ch()、OpenBuyStopOrder_Ch()、OpenSellLimitOrder_Ch()、OpenSellStopOrder_Ch() の外部変数 'Money_Management' を初期化する際、ひじょうに注意を払います。
5. ポジション管理表関数は、エラー発生コードに従いトレード間ですべて正しいポーズを保持します。
6. ポジションクローズ、未決注文削除、ストップロス移動前に、関数 CloseOrder_Ch()、CloseOrder_Ch()、 Make_TreilingStop_Ch() はポジションがフリーズしているか確認し、フリーズしていればアクションを起こしません。
7. ポジションクローズに先立ち、関数CloseOrder_Ch() はスキャルピング的ではない純利益を確認します。ポジションがスキャルピング範囲にあることがわかれば、アクションを起こしません。
8. 関数 Make_TreilingStop_Ch() は、このストップロスによってクローズされたポジションの利益が「スキャルピング範囲」に入る価格範囲にストップロスを移動しません。
おわりに
さて、「自動売買チャンピオンシップ」での典型的な EA 動作に関してお話ししたかったことはすべてここにあります。もちろん、もう一つ、EA が CPU リソースを贅沢に消費することに関するむしろ実際的な問題はあります。ただ、ほとんどの場合、この問題は動作中に EA が呼び出すインディケータが非効率的に書かれていることによることが多いものです。そしてこれはまったく別の問題です。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1542



- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索