コーディングの方法は? - ページ 297

 

...

テランス

クローズドバーのクロスをテストしたかったのですね。シフト1は最初のクローズドバー、シフト2はその前のバーを意味します。そして、もし閉じたバーでのクロスをテストしたいのであれば、これらのバーをテストする必要があります。

(diff1*diff2)<0)の場合。これは非常に簡単です。

diff1 は、バー1における2つの平均の差です。

diff2 は、2本目のバーの2つの平均の差です。

正でも負でも構いません。私たちが注目するのは、一方がプラスでもう一方がマイナスの場合です。掛け算をすることで、交差があった場合に素早く答えが得られます(符号が異なる場合、結果は0より小さく、符号が等しい場合、掛け算の結果は0より大きくなります)。

このコードが何をするものなのか、ご理解いただけたでしょうか?

tkuan77:
こんにちは、Mladen。教えていただいたことを試してみたところ、とてもうまくいきました。しかし、私はコードの背後にあるロジックをよく理解していません。なぜiMAのシフトを1と2に設定し、なぜこのようなコードを書いているのでしょうか。(diff1*diff2)<0)とするのでしょうか?申し訳ありませんが、私は現在まだ学習フレーズの途中です。

ありがとうございました。

テランス
 

矢印の付け方

添付は、最後の数回の投稿で説明したMAクロスオーバーEAの短縮版です。

このバージョンは、閉じたローソク足でクロスオーバーが発生した場合、ログファイルにメッセージを印刷します。

このPrintロジックを、チャート上に上下の矢印を表示するコードに置き換えることは可能でしょうか?

ご教授のほど、よろしくお願いいたします。

ファイル:
 

...

この方法で試してみてください ...

矢印が表示され、チャートの 右下隅にコメントが表示されます - このような(それが何を行うかを明らかにするために、チャート上の平均を追加しました) 。

michaelB:
添付は、ここ数回の投稿で議論されたMAクロスオーバーEAの短縮版です。

このバージョンでは、閉じたローソク足でクロスオーバーが発生した場合、ログファイルにメッセージを印刷します。

このPrintロジックを、チャート上に上下の矢印を表示するコードに置き換えることは可能でしょうか?

よろしくお願いします。
ファイル:
 

MAアローズ

2MAcrossover(コメント付き)」はとてもよく機能します。

ただ、一つ質問なのですが、一度表示された矢印は、新しいローソク足が開くと消えてしまいますが、これは意図的なものなのでしょうか?

チャートの 右下にあるコメントが気に入っています。

またよろしくお願いします。

 
mladen:
テランス

クローズドバーでクロスをテストしたかったのですね。シフト1は最初のクローズドバー、シフト2はその前の最初のバーを意味します。そして、もしあなたが閉じたバー上のクロスをテストしたいのであれば、これらのバーをテストする必要があるのです。

(diff1*diff2)<0)の場合。これは非常に簡単です。

diff1は、1小節目の2つの平均

diff2は、2小節目の2つの平均の差

正でも負でも構いません。私たちが注目するのは、一方がプラスで他方がマイナスである場合、それは平均がクロスしたことを意味します。掛け算をすることで、交差しているかどうかがすぐにわかります(符号が異なる場合は結果が0より小さく、符号が等しい場合は掛け算の結果が0より大きくなります)。

このコードで何ができるのかが明らかになったでしょうか?

Mladenさん、ありがとうございます。しかし、そのコードを追加したところ、私のEAは少しおかしくなってしまったようです。時々、私のスクリーンショットに示されているように、実際のSLやTPに到達する前に、SLやTPが勝手に自動化されることがあります。

ありがとうございます。

テランス

//--- 入力パラメータ

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

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

//| エキスパート初期化関数

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

int init()

{

//----

//----

return(0);

}

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

//| エキスパート初期化関数

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

int deinit()

{

//----

//----

return(0);

int mainCrossed (double mainline1 , double mainline2)

{

static int mainlast_direction = 0;

static int maincurrent_dirction = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; //メインを上げる

if(mainline1<mainline2)メインカレントディレクション = 2; //メインダウン

if(maincurrent_dirction != mainlast_direction) //メイン変更

{

mainlast_direction = maincurrent_dirction;

return (mainlast_direction);

}

さもなくば

{

return (0);

}

}

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

//| エキスパートスタート機能

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

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma, mainshortEma, mainlongEma;

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

if(テイクプロフィット<10)

{

Print("TakeProfitが10未満");

return(0); // TakeProfitのチェック

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1); double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2); double longEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2); double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,3);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2; double diff1 = shortEma1-longEma1; double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

if ((diff1*diff2)<0))

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*ポイント, Ask+TakeProfit*Point,

"私のEA",12345,0,緑);

if(チケット>0)

{

if(オーダーセレクト(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

else Print("BUY注文の開始エラー :",GetLastError())。

return(0);

}

if(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point.Bid-TakeProfit*Point), if(isCross == 2 && mainshortEma < mainlongEma) { チケットを送信します。

Bid-TakeProfit*Point, "私のEA",12345,0,Red)。

if(チケット>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

else Print("SELL注文の開始エラー :",GetLastError());

return(0);

return(0);

return(0);

}

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

ファイル:
ps.jpg  16 kb
 

テランス

そのコードはSLやTPとは関係ありません。単にクロスの2平均をテストしているだけです(michaelBが2MACrossesでどのように同じコードを使ったか、それもnan EAなので見てください)。あなたのコードの残りの部分は、これらのSLとTPのエラーのために修正される必要があります。

tkuan77:
Mladenさん、ありがとうございます。しかし、このコードを追加したところ、私のEAは少しおかしくなってしまったようです。時々、私のスクリーンショットに示されているように、実際のSLやTPに到達する前であっても、勝手にSLやTPを自動化します。

ありがとうございました。

テランス

//--- 入力パラメータ

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

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

//| エキスパート初期化関数

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

int init()

{

//----

//----

return(0);

}

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

//| エキスパート初期化関数

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

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int mainlast_direction = 0;

static int maincurrent_dirction = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; //メインを上げる

if(mainline1<mainline2)メインカレントディレクション = 2; //メインダウン

if(maincurrent_dirction != mainlast_direction) //メイン変更

{

mainlast_direction = maincurrent_dirction;

return (mainlast_direction);

}

さもなくば

{

return (0);

}

}

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

//| エキスパートスタート機能

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

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma, mainshortEma, mainlongEma;

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

if(テイクプロフィット<10)

{

Print("TakeProfitが10未満");

return(0); // TakeProfitのチェック

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1); double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2); double longEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2); double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2; double diff1 = shortEma1-longEma1; double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

if ((diff1*diff2)<0))

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*ポイント, Ask+TakeProfit*Point,

"私のEA",12345,0,緑);

if(チケット>0)

{

if(オーダーセレクト(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

else Print("BUY注文の開始エラー :",GetLastError())。

return(0);

}

if(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point.Bid-TakeProfit*Point), if(isCross == 2 && mainshortEma < mainlongEma) { チケットを送信します。

Bid-TakeProfit*Point, "私のEA",12345,0,Red)。

if(チケット>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

else Print("SELL注文の開始エラー :",GetLastError());

return(0);

return(0);

return(0);

}

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

...

はい、意図的なものです。

インジケータではなくEAを作ったので、最後のアクティブなクロスだけを表示し、アクティブなクロスがないときは矢印を表示しないように追加したものです。複数の矢印を表示させるには、まずインジケータに変換して、全体を書き換える必要がありますが、すでにチャート上に平均クロスを表示しているインジケータがたくさんあると思いますので、そのようなインジケータを作ればいいのではないでしょうか。

michaelB:
2MAcrossover with comments」は本当によくできていますね。

一つ質問なのですが、一度表示された矢印は、新しいローソク足が開くと消えてしまうのですが、これは意図的なものでしょうか?

チャートの右下のコメントもいいですね。

本当にありがとうございます。
 
mladen:
Terrance そのコードはSLやTPとは何の関係もないんだ。これは単にクロスの2つの平均をテストしているだけです(michaelBが2MACrossesで同じコードを使っているのをご覧ください、あれもnan EAですから)。あなたのコードの残りの部分は、これらのSLとTPのエラーのために修正される必要があります。

こんにちは、Mladen。

私のTPとSLの設定方法が間違っているということでしょうか?

ということでしょうか?

テランス

 

...

テランス

TSD :Lessons のこのセクションはご覧になりましたか?

多くの質問がすでにそこで回答されていますし、一般的なEAの書き方についても非常に良い例を見つけることができると思います。あなたの質問についてですが、私はあなたのEAをテストしていませんので、わかりません。他人のEAをテストする際の問題点は、そのEAのアイデアやロジックを知らなければならず、多くの場合、コード自体からそれらを「読み取る」ことは不可能であることです。私たちが話していたコードの断片は、閉じたバー上の2つの平均のクロスを検出する方法に関するもので、そのコードはまさにそれだけをやっているのです。それが、私が「SLやTPとは関係ない」と言った理由です。

よろしくお願いします。

ムラデン

tkuan77:
こんにちは、Mladen。

私のTPとSLの設定方法が間違っているということでしょうか?

よろしくお願いします。

テランス
 

MQLレッスンのスレッド

mladen--リンクありがとうございます!