[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 3. - ページ 182

 
 
dent:
アドバイザーの注文方法
ご注文はこちらから: https://www.mql5.com/ru/job
 
NaVolne:


なぜ、そのようなことになるのでしょうか。

EAは1ティックごとに処理し、1ティックごとにチェックと注文の開始がある...。最後のオープンポジションの 時間を覚えておき、15分間休止する必要がありますが、バーのオープニングまたはクローズで作業することもできます。コードでバータイムと連動している方が良い。

double OpenBar=0; 
 
int start()
   {
    //Проверка на начало нового бара
    if (OpenBar==Time[0]) {return;} else {OpenBar=Time[0];}
    //ваш код
   }
 
dent:
アドバイザーの注文方法
 
OlegTs:
double OpenBar=0; 

 

int start()
   {
    //Проверка на начало нового бара
    double CurOpenBar=iOpen(NULL,PERIOD_M15,0);  
    if (OpenBar==CurOpenBar) {return;} else {OpenBar=CurOpenBar;}
    //ваш код
   }


というような

悪い例です。なぜなら、ローソク足の 値を繰り返すことができるからです。しかし、タイミングはそうではありません。
 
MaxZ:
悪い例です。なぜなら、ローソク足の始値を繰り返すことができるからです。しかし、タイミングはそうではありません。

私もそう思います:)))
 
みんなどうもありがとう、うまくいき始めたよ :)
 

mcl4を勉強して、テスト用のEAを書 こうとしています。という疑問も出てきました。

1) 分析した履歴から、このペアの分足ローソクの欠落を確認する手順はありますか?もしかしたら、すでに手順が書かれていて、ネット上で公開されているのかもしれませんね。

2) ギャップがある場合、または履歴が少ない場合、EAはどのようにして必要な日付からそのペアの全分値のローソク足をダウンロードし、ギャップを埋めることができますか?

EAが作業中に履歴の正しさを確認し、必要に応じてギャップや少ない本数のバーを修正するというものです。
 

プログラミング言語を学習しているのですが、プログラムの動作が理解できなくて困っています。教科書を元にEAを書きましたが、少し違う動作原理でひねっています。

Expert Advisor は、2 つのムウイング平均をベースにしています。移動平均線が交差すると、注文が終了し、反対側の注文が開始されるという単純なものです。EAを作成し、問題なく動作しています。もちろん、若干のハンデはありますが、考え方に沿うものです。問題の全体像は次の通りです(太字)。

A=iMA(NULL,0,Period_MA_1,0,MODE_SMA, PRICE_CLOSE,1); // A

B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // Bの場合

C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C

D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D

移動平均の計算方法を変えて(プラス記号を表示できる)、単純な方法(MODE_EEMA )ではなく指数法 MODE_SMA) 、さらにもう一つ(MODE_SMMA)、いわゆる平滑法を入れると、すべてがおかしくなります。 EAは設定された期間の一番最初に注文を開き、最後に閉じるので、動作原理はさらに面白くなります(ストラテジーテスターで)。すなわち、1年間、期首に1つの取引を開始し、期末にそれを決済する。結果的にExpert Advisorでプラスになったが、そんなプラスは必要ない。自分でコインを使って買いか売りの注文を出し、1年後に勝っているか負けているかを見ることができるのです。ちなみに、MODE_SMAを MODE_LWMA 線形加重移動平均)に設定すると、プログラムは正常に動作 します。

何が問題なのか、アドバイスをお願いします。原理は同じで、移動平均の計算方法が少し変わっただけです。

以下は、プログラムの全コードです。

//+------------------------------------------------------------------+

//| 2本の移動平均線に基づく.mq4

//| 著作権 © 2011, MetaQuotes Software Corp.

//| http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright"著作権 © 2011, MetaQuotes Software Corp.

#プロパティリンク "http://www.metaquotes.net"



//--------------------------------------------------------------- 1 --

// M15の数値


extern int period_MA_1=6; // 周期MA1

extern int Period_MA_2=15; // 周期MA 2

extern double Lots =0.1; // 固定ロット数



bool Work=true; // Expert Advisorが動作する。

string Symb; // 金融商品の名称

//--------------------------------------------------------------- 2 --

int start()

{

イント

Total, // ウィンドウ内の注文数

Tip=-1, // オーダータイプ選択 (B=0,S=1)

チケット; // 注文番号

二重

A, //Value.最後から1小節目のMA_1値

最後から1小節目のMA_2値

価格, // 選択された注文の価格

C, //Value.最後から2小節目のMA_1

D, // Significance.最後から2本目のバーのMA_2値

Lot; // 選択された注文のロット数

ブール

Ans =false, // クローズ後のサーバーレスポンス

Cls_B=false, // 買いを閉じる基準

Cls_S=false, // 売りの終了基準

Opn_B=false, // 開くの基準 Buy

Opn__S=false; // 売りの開始の判断基準

//--------------------------------------------------------------- 3 --

//前処理

if(Bars < Period_MA_2) // 十分なバーがない。

{

Alert("Not enough bars in the window. Expert Advisor is not working.");

return; // start() を終了する。

}

if(Work==false) // 重大なエラーが発生しました。

{

Alert("Critical error. Expert Advisor is not working.");

return; // start() を終了する。

}

//--------------------------------------------------------------- 4 --

// オーダーカウント

Symb=Symbol(); // 金融商品の名前。

Total=0; // 注文数

for(int i=1; i<=OrdersTotal(); i++) // オーダーループ

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // 以下の場合。

{ // オーダー解析。

if (OrderSymbol()!=Symb)continue; // 当社の金融商品ではありません。

if (OrderType()>1) // 保留注文があります。

{

Alert("未決済注文を検出しました。 Expert Advisorは動作していません。")

return; // Exit()

}

Total++; // 成行注文カウンター

if (Total>1) // 注文が1件以上ない場合

{

Alert("複数の成行注文があり、Expert Advisorが動作していません。")

return; // Exit()

}

Ticket=OrderTicket(); // 注文番号が選択されました。

Tip =OrderType(); // 選択されたオーダーのタイプ。

Price =OrderOpenPrice(); // 選択された注文の価格です。

Lot =OrderLots(); // ロット数

}

}

//--------------------------------------------------------------- 5 --

// 取引条件

A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A

B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // Bの場合

C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C

D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D


if (A<C&C>D&B>=A) // МА1 線が下向きになる。

{MA1がMA2を横切る

Opn_B=true; // 上から下へ

Cls_S=true; // ・・・・・・。

}

if (B<D&D>C&&A>=B) // MA2線が下降する。

{MA2がMA1とクロスする

Opn_S=true; // トップダウン型

Cls_B=true; // (※英語版のみ

}

//--------------------------------------------------------------- 6 --

// 注文を閉じる

while(true) //順番にループを閉じる。

{

if (Tip==0 && Cls_B==true) //買い注文を開く。

{ //終了基準あり

アラート("買物を終了しようとしています",チケット,";)

RefreshRates(); // データをリフレッシュする

Ans=OrderClose(Ticket,Lot,Bid,2);//買いのクローズ

if (Ans==true) // うまくいきました :)

{

アラート(「買い注文終了」,チケット;)

break; // クローズループから抜ける

}

if (Fun_Error(GetLastError())==1) // エラー処理

continue; // 再試行

return; // start() を終了する。

}


if (Tip==1 && Cls_S==true) // 売り注文を開始しました。

{ // 近い基準がある

アラート("売りの終了を試みています",チケット,";)

RefreshRates(); // データをリフレッシュする

Ans=OrderClose(Ticket,Lot,Ask,2);//売りのクローズ

if (Ans==true) // うまくいきました :)

{

アラート(「売り注文が終了しました」,チケット;)

break; // クローズループから抜ける

}

if (Fun_Error(GetLastError())==1) // エラー処理

continue; // 再試行

return; // start() を終了する。

}

break; // 終了する間

}

//--------------------------------------------------------------- 7 --

//--------------------------------------------------------------- 8 --

//受注開始

while(true) //順番にループを閉じる。

{

if (Total==0 && Opn_B==true) // 未決済注文はありません。

{ //オープンバイヤーの基準です。

RefreshRates(); // データを更新する

Alert("Trying to open Buy. Waiting for reply...");

チケット=OrderSend(Symb,OP_BUY,Lots,Ask,20,0,0, "EA 2xMA");//買いを開く

if (Ticket > 0) // うまくいった :)

{

アラート(「買い注文が開きました」,チケット;)

return; //オーダーを終了する

}

if (Fun_Error(GetLastError())==1) // エラー処理

continue; // 再試行

return; // start() を終了する。

}

if (Total==0 && Opn_S==true) // 未決済注文はありません。

{ //売り基準を開く。

RefreshRates(); // データを更新する

Alert("Attempting to open Sell. Waiting for reply...");

チケット=OrderSend(Symb,OP_SELL,Lots,Bid,20,0,0, "EA 2xMA");//OpenSel.

if (Ticket > 0) // うまくいった :)

{

アラート("売り注文が開きました",チケット;)

return; // start() から終了する。

}

if (Fun_Error(GetLastError())==1) // エラー処理

continue; // 再試行

return; // start() を終了する。

}

break; // 終了する間

}

//--------------------------------------------------------------- 9 --

return; //start()から抜ける

}

//-------------------------------------------------------------- 10 --

int Fun_Error(int Error) // エラー処理 fie

{

switch(エラー)

{ // 乗り越えられないエラー。

case 4: Alert("The trade server is busy. Try again...");

Sleep(3000); // 簡単な解決方法です。

return(1); // 関数を終了します。

case 135:Alert("Price changed. Try again...");

RefreshRates(); // データをリフレッシュします。

return(1); // 関数を終了します。

case 136:Alert("No price. Waiting for new tick...");

while(RefreshRates()==false) // 新しいティックを表示する。

Sleep(1); // ループ内の遅延時間

return(1); // 関数を終了します。

case 137:Alert("Broker is busy. Try again...");

Sleep(3000); // 簡単な解決方法です。

return(1); // 関数を終了します。

case 146:Alert("The trading subsystem is busy. Try again...");

Sleep(500); // 単純な判定

return(1); // 関数を終了します。

// クリティカルエラー

case 2: Alert("一般的なエラー;")

return(0); // 関数を終了します.

case 5: Alert("Older version of the terminal.");

Work=false; // もう動作しない

return(0); // 関数を終了します。

case 64: Alert("アカウントがブロックされました。");

Work=false; // もう動作しない

return(0); // 関数を終了します。

case 133:Alert("取引禁止。");

return(0); // 関数を終了します。

case 134:Alert("Not enough money to execute the transaction")と表示されます。

return(0); // 関数を終了します。

default: Alert("An error has occurred ",Error); // その他のオプション

return(0); // 関数を終了します。

}

}

//-------------------------------------------------------------- 11 --



 
neisseria:

プログラミング言語を学習しているのですが、プログラムの動作が理解できなくて困っています。チュートリアルを元にEAを書きましたが、少し違う原理に変更しました。



注文を閉じるとき、Totalを減らすといいのですが、もっといいのは、そんなことは気にせず、シンボルとマジックナンバーのオープンオーダーの数を返す関数を作ることです。

4本の移動平均 線は多すぎるので、2つの期間で、異なるオフセットで表示するのがよいでしょう。画面上に表示して、挙動を確認することをお勧めします。