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

 
mladen:
テランス

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

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

よろしくお願いします。

ムラデン

Mladenさん、またまたお邪魔します。私のコードを見てみると、TPやSLだけでなく、時には売買注文さえもずれていることに気づきました。このような場合、「left.left.left.left.left.left.left.left.left.left.left.left.left.left.私は真剣にコードで私のエラーの原因を見つけるように見えることはできません。

MAのクロスはLongとShortの注文と一緒にあるべきように動作しますが、私がそれをテストするために基本的なASK関数をしたときでさえ、時々エントリとエグジットがおかしくなっているようです。どうかご教授ください。

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

テランス

 

...

テランス

最初に:あなたのブローカーはECN/STPのようなものですか?もしそうなら、ストップロスやテイクプロフィットを 注文の開始と同時に設定することはできず、まずそれらを0に設定した注文を開き、OrderModify()ですでに開いた注文にストップロスやテイクプロフィットを設定しなければなりません。

第二に、ターミナルウィンドウのエキスパートタブに何か書き込まれているかどうかを常にチェックすること。

第三に、このような行を置くとよいでしょう。

int err=GetLastError(); Print(err);

各オーダー管理機能の後に。experts/include/stderror.mqhファイルにあるエラーの説明(注文で起こりうる多くのエラー(起こりうるエラーコードと説明のリストを見てください)があり、あなたは可能な限りのエラーを監視しなければなりません)既知のエラーコード(上記からのコードの行)で、何が起こっているかを推測するより、特定のエラー修正に専念することができます。

tkuan77:
こんにちは、Mladen。私のコードを見てみると、TPとSLだけでなく、時々買い注文と売り注文さえもずれていることに気づきました。私は、codersgurusから教えてもらったレッスンのリンクを調べ、私が持っていて私のコードを基にしたチュートリアルのセットと同じでした。私は真剣にコードで私のエラーの原因を見つけることができないようです。

MAのクロスはLongとShortの注文と同様に機能しますが、基本的なASK関数でテストしてもEntryとExitがおかしくなることがあります。どうかご教授ください。

ありがとうございます。

テランス
ファイル:
terminal_1.gif  62 kb
 
mladen:
テランス

最初に:あなたのブローカーは、ECN/STPのようなものですか?もしそうなら、ストップロスやテイクプロフィットを注文と一緒に出すことはできません。まず、それらを0に設定して注文を出し、OrderModify()を使って、すでに出した注文にストップロスやテイクプロフィットを設定しなければなりません。

第二に、ターミナルウィンドウのエキスパートタブに何か書き込まれているかどうかを常にチェックすること。

第三に : このような行を置くのは良いアイデアかもしれません。

int err=GetLastError(); Print(err);
各Order管理関数の後。experts/include/stderror.mqhファイルにあるエラーの説明(オーダーで起こりうるエラーはたくさんあり(考えられるエラーコードと説明のリストをご覧ください)、考えられるエラーを一つ一つ監視しなければなりません)既知のエラーコード(上記のコードの行)があれば、何が起こっているかを推測する代わりに、特定のエラーの修正に集中できます。

Mladenさん、こんにちは。

ECN/STPの件、ご指摘ありがとうございます。あなたが言うまで、私はそれらについて知りませんでした。ご指摘の通り変更したのですが、私にとっては最悪の事態になってしまいました。エントリーとエグジットの問題が続くだけでなく、私のSLが行方不明になっています。これは私が考えていたより難しいことです。

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

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,0,Ask+TakeProfit*ポイント,

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

if(ticket>0)

{

if(オーダーセレクト(チケット,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,0,Bid-TakeProfit*ポイント,

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

if(ticket>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

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

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

return(0);

return(0)。

}

for(cnt=0;cnt<total;cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()))

{

if(OrderType()==OP_BUY)// ロングポジションがオープン

{

OrderClose(OrderTicket(),OrderLots(),Ask-StopLoss*Point,3,Violet).のようになります。

// ポジションを閉じる

return(0); // 終了

}

else // ショートポジションに移動

{

オーダークローズ(OrderTicket(),OrderLots(),Bid+StopLoss*Point,3,Violet);

// ポジションを閉じる

return(0); // 終了

}

}

}

return(0);

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

 
mladen:
Terrance

最初に:あなたのブローカーは、ECN/STPのようなものですか?もしそうなら、ストップロスやテイクプロフィットを注文と一緒に出すことはできません。まず、それらを0に設定して注文を出し、OrderModify()を使って、すでに出した注文にストップロスやテイクプロフィットを設定しなければなりません。

第二に、ターミナルウィンドウのエキスパートタブに何か書き込まれているかどうかを常にチェックすること。

3つ目 : このような行を置くのも良いアイデアかもしれません。

int err=GetLastError(); Print(err);
各順序の管理機能の後。experts/include/stderror.mqhファイルにあるエラーの説明(オーダーで起こりうるエラーはたくさんあり(考えられるエラーコードと説明のリストをご覧ください)、考えられるエラーを一つ一つ監視しなければなりません)既知のエラーコード(上記のコードの行)があれば、何が起こっているかを推測する代わりに、特定のエラーを修正することに集中できます。

Mladen、ここ数日のあなたの協力に感謝します。私のコードで、入出力のエラーの 原因となっているエラーを見つけることができました。

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

Terrance

 

1つ以上のトレードを開く

こんにちは、私は私のEAが複数の取引を開くことができるようにしようとしてきたが、今のところ私はそれが1つの取引に限定することができます。

私の目的は単純です。

LWMA 10がLWMA 20を下回る場合、システムはLWMA 10と20の両方がSMA 50を下回る場合にショートし、ロングトレードの場合はその逆となります。

私はEAが2つ以上の取引を行わないように制限したいのですが、コードを変更すると、1つの基準で1つの取引を行う代わりに、一度に2つの取引を行うようになります。

カウンターシステムか何かを設定する必要があるのでしょうか、それとも私の取引の1つがすでにTPかSLになったときに反応するようにカウンターを設定するにはどうしたらいいのでしょうか?

どなたか、私のコードに何か問題があるのか、教えていただけませんか?

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

テランス

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

extern double TakeProfit=500.0;

extern double Lots=0.1;

extern double StopLoss=500.0。

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

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のチェック

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

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,50,0,MODE_SMA,PRICE_CLOSE,0);

if ((diff1*diff2)<0))

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

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

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

return(0);

return(0);

if(total == 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point. "私のEA",12345,0)。

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

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

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

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

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

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

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

return(0);

return(0);

return(0);

}

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

 

ご質問

ムラデン

教えていただいたリンクからレッスンを探しているのですが、それらは一般的なレッスンであり、私はHendersonのインジケーターに特化した情報を探しているのですが...。

また、投稿されたスレッドに目を通しましたが、その後、以下のことを調べたいと思っています。

-わかりやすい言葉で言うと、「だいたい何本くらいで色が変わるのか」ということです。

言い換えれば、線の色が青からピンクに変わるまで、最大何バーかかるのでしょうか?残念ながら、私は空想の専門用語を理解していないと私は私が移動し、戦略を開始することができ、非常に単純な応答をappriciatedでしょう。premalmunshaw@yahoo.com は私のメールアドレスです。

私はこのパッケージを有効にするために39ドルを支払おうとしています。

前向きな返答を楽しみにしています。

よろしくお願いします。

プレマル・マンショー

mladen:
率直に言って、私はあなたが何を求めているのか理解できません。

もし、「いつ色が変わるのか」という質問であれば、答えは「傾きが変わるとき」です。

もし、「どのように色が変わるのか」という質問であれば、その答えは、このセクションに書かれています。レッスン 内容 .
 

...

残念ながら、私はあなたの質問を理解していないので、私は自分自身を再表明します(計算の長さは、ヘンダーソンのフィルタの計算長さを指します)。

もし、計算の長さが5であれば、最後の2本のバーが変わる可能性があります。

計算長が7であれば、最後の3本が変化する可能性があります。

計算長が9であれば、最後の4小節が変化する可能性があります。

これより簡単には答えられない。ヘンダーソンのフィルターがどのように計算されるのか、これ以上簡単な説明はありません。もし私がフーリエ変換を「1+1=2」の観点から説明しようとするならば、それは同じことです。あなたが提供されたリンクを調べてみてください。

残りの部分について:あなたはフィルターの背後にある数学へのリンクを得たし、何本のバーが再計算されるかについての情報を得たし、エリートセクションニュースレッドからの例さえ得たのです。そのフィルターを使った戦略について:再計算する指標(SSA、ヘンダーソンフィルター、中心化TMA、フーリエ変換、回帰分析など)は「シグナルモード」ではなく「推定モード」で使うべきだと、何千回もの投稿で言ってきたはずです。もし、Henderson's filterのシグナルが欲しいのであれば、それは完全に間違った方向であり、もし、それがエリートセクションの購読を検討する唯一の理由であれば、購読しない方が良い。

PS:あなたのメールを公開するのは悪い習慣です。そうすれば、あなたのメールボックスに大量のスパムメールが届くだけです。

______________________________________

あなたのトレーディングシステムの探求が成功することを祈っています。

よろしくお願いします。

ムラデン

premalmunshaw:
ムラデン

教えていただいたリンクからレッスンを探そうとしているのですが、それらは一般的なレッスンであり、私はヘンダーソンのインジケーターに特化した情報を探しているのです...。

また、投稿されたスレッドに目を通しましたが、その後、以下のことを調べたいと思っています。

-わかりやすい言葉で言うと、「だいたい何本くらいで色が変わるのか」ということです。

言い換えれば、線の色が青からピンクに変わるまで、最大何バーかかるのでしょうか?残念ながら、私は空想の専門用語を理解していないと私は私が移動し、戦略を開始することができ、非常に単純な応答をappriciatedでしょう。premalmunshaw@yahoo.com は私のメールアドレスです。

私はこのパッケージを有効にするために39ドルを支払おうとしています。

前向きな返答を楽しみにしています。

よろしくお願いします。

プレマル・マンショー
 

Mladenです。

私のトレードにカウンターを設定し、私のトレードがTPまたはSLになったときにカウンターのジャンプをトリガーできるような方法はありますか?

よろしくお願いします。

テランス

tkuan77:
こんにちは、私は自分のEAを複数の取引を開始できるようにしようとしていますが、今のところ1つの取引に限定することができます。

私の目的は単純です。

LWMA 10がLWMA 20を下回るとき、システムはLWMA 10と20の両方がSMA 50を下回る場合にショートし、ロングトレードの場合はその逆です。

私はEAが2つ以上の取引を行わないように制限したいのですが、コードを変更すると、1つの基準で1つの取引を行うのではなく、一度に2つの取引を行うようになります。

カウンターシステムか何かを設定する必要があるのでしょうか、それとも私の取引の1つがすでにTPかSLになったときに反応するようにカウンターを設定するにはどうしたらいいのでしょうか?

どなたか、私のコードに何か問題があるのか、教えていただけませんか?

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

テランス

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

extern double TakeProfit=500.0;

extern double Lots=0.1;

extern double StopLoss=500.0。

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

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のチェック

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

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,50,0,MODE_SMA,PRICE_CLOSE,0);

if ((diff1*diff2)<0))

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

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

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

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

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

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

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

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

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

return(0);

return(0);

if(total == 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point. "私のEA",12345,0)。

"私の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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

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);

}

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

...

この機能を試してみて ください。

int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
そして、次の
ように確認します。if openedBuys==0 open buy

if openedSells==0 open sell

tkuan77:
ムラデン

私の取引にカウンターを設定し、私の取引にTPまたはSLがあるとき、カウンターのジャンプをトリガーできるような方法はありますか?

ご希望

テランス
 

Mladenさん、こんにちは。

Bars関数を使った別の方法を思いつきました。トレードがトリガーされたとき、私はbars関数で 整数のカウントを設定し(例えば、買いトレードはbars 122でトリガーされ、したがってカウントは122になります)、私の基準が再びトリガーされたとき、私は再びbar関数を呼び、カウントとそれを比較し、新しいカウントが前のカウント(この場合122)より高い場合にのみトレードをトリガーします。

しかし、私はまだ基準ごとに1ではなく、一緒に2つの取引をトリガしています。これはなぜでしょうか?

助けてください。

よろしくお願いします。

テランス

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

extern double TakeProfit=530.0;

extern double Lots=0.1;

extern double StopLoss=520.0;

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

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

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

int init()

{

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

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のチェック

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0)。

longEma = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1)です。

double longEma1 = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,1); double longEma1 = iMA(NULL,0,25,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,25,0,MODE_LWMA,PRICE_CLOSE,2); double longEma2 = iMA(NULL,0,25,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,113,0,MODE_EMA,PRICE_CLOSE,0);

if ((diff1*diff2)<0))

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

int BarCounter, BarCounter2;

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

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

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

if(チケット>0)

{

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

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

BarCounter = Bars;

}

else Print("Error opening BUY order :",GetLastError());

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

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

BarCounter = Bars;

else Print("Error opening SELL order :",GetLastError());

return(0);

}

return(0);

if(total == 1)

{

BarCounter2 = Bars;

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma && BarCounter2 > BarCounter)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

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

if(チケット>0)

{

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

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

BarCounter = BarCounter2;

}

else Print("Error opening BUY order :",GetLastError());

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma BarCounter)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point.My EA),12345.Bid-TakeProfit*Point.Bid-TopLoss*ポイント,

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

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

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

BarCounter = BarCounter2;

}

else Print("Error opening SELL order :",GetLastError());

return(0);

}

return(0);

return(0);

}

mladen:
この関数を試してみてください。
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
もし、
openBuys==0なら買いを

、openSells==0なら売りをオープンして

ください。