[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 3. - ページ 182 1...175176177178179180181182183184185186187188189...652 新しいコメント dent 2011.09.16 11:56 #1811 アドバイザーの注文 方法 DDFedor 2011.09.16 11:59 #1812 dent: アドバイザーの注文方法 ご注文はこちらから: https://www.mql5.com/ru/job Всеволод 2011.09.16 12:01 #1813 NaVolne:なぜ、そのようなことになるのでしょうか。EAは1ティックごとに処理し、1ティックごとにチェックと注文の開始がある...。最後のオープンポジションの 時間を覚えておき、15分間休止する必要がありますが、バーのオープニングまたはクローズで作業することもできます。コードでバータイムと連動している方が良い。 double OpenBar=0; int start() { //Проверка на начало нового бара if (OpenBar==Time[0]) {return;} else {OpenBar=Time[0];} //ваш код } Oleg 2011.09.16 12:02 #1814 dent: アドバイザーの注文方法 Maxim Zaguzov 2011.09.16 12:13 #1815 OlegTs:double OpenBar=0; int start() { //Проверка на начало нового бара double CurOpenBar=iOpen(NULL,PERIOD_M15,0); if (OpenBar==CurOpenBar) {return;} else {OpenBar=CurOpenBar;} //ваш код } というような 悪い例です。なぜなら、ローソク足の始 値を繰り返すことができるからです。しかし、タイミングはそうではありません。 Oleg 2011.09.16 13:35 #1816 MaxZ: 悪い例です。なぜなら、ローソク足の始値を繰り返すことができるからです。しかし、タイミングはそうではありません。 私もそう思います:))) 削除済み 2011.09.16 15:18 #1817 みんなどうもありがとう、うまくいき始めたよ :) 削除済み 2011.09.16 16:39 #1818 mcl4を勉強して、テスト用のEAを書 こうとしています。という疑問も出てきました。1) 分析した履歴から、このペアの分足ローソクの欠落を確認する手順はありますか?もしかしたら、すでに手順が書かれていて、ネット上で公開されているのかもしれませんね。2) ギャップがある場合、または履歴が少ない場合、EAはどのようにして必要な日付からそのペアの全分値のローソク足をダウンロードし、ギャップを埋めることができますか? EAが作業中に履歴の正しさを確認し、必要に応じてギャップや少ない本数のバーを修正するというものです。 削除済み 2011.09.16 16:58 #1819 プログラミング言語を学習しているのですが、プログラムの動作が理解できなくて困っています。教科書を元に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 -- どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - KimIVの便利な機能 [ARCHIVE] Any rookie question, Всеволод 2011.09.16 18:03 #1820 neisseria:プログラミング言語を学習しているのですが、プログラムの動作が理解できなくて困っています。チュートリアルを元にEAを書きましたが、少し違う原理に変更しました。 注文を閉じるとき、Totalを減らすといいのですが、もっといいのは、そんなことは気にせず、シンボルとマジックナンバーのオープンオーダーの数を返す関数を作ることです。 4本の移動平均 線は多すぎるので、2つの期間で、異なるオフセットで表示するのがよいでしょう。画面上に表示して、挙動を確認することをお勧めします。 1...175176177178179180181182183184185186187188189...652 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
アドバイザーの注文方法
なぜ、そのようなことになるのでしょうか。
EAは1ティックごとに処理し、1ティックごとにチェックと注文の開始がある...。最後のオープンポジションの 時間を覚えておき、15分間休止する必要がありますが、バーのオープニングまたはクローズで作業することもできます。コードでバータイムと連動している方が良い。
アドバイザーの注文方法
というような
悪い例です。なぜなら、ローソク足の始値を繰り返すことができるからです。しかし、タイミングはそうではありません。
私もそう思います:)))
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 --
プログラミング言語を学習しているのですが、プログラムの動作が理解できなくて困っています。チュートリアルを元にEAを書きましたが、少し違う原理に変更しました。
注文を閉じるとき、Totalを減らすといいのですが、もっといいのは、そんなことは気にせず、シンボルとマジックナンバーのオープンオーダーの数を返す関数を作ることです。
4本の移動平均 線は多すぎるので、2つの期間で、異なるオフセットで表示するのがよいでしょう。画面上に表示して、挙動を確認することをお勧めします。