//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.05.2008 |//| Описание : Возвращает флаг закрытия последней позиции по стопу. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
datetime t;
double ocp, osl;
int dg, i, j=-1, k=OrdersHistoryTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(sy, MODE_DIGITS);
if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
ocp=NormalizeDouble(OrderClosePrice(), dg);
osl=NormalizeDouble(OrderStopLoss(), dg);
if (ocp==osl) return(True);
}
return(False);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.05.2008 |//| Описание : Возвращает флаг закрытия последней позиции по тейку. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
datetime t;
double ocp, otp;
int dg, i, j=-1, k=OrdersHistoryTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(sy, MODE_DIGITS);
if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
ocp=NormalizeDouble(OrderClosePrice(), dg);
otp=NormalizeDouble(OrderTakeProfit(), dg);
if (ocp==otp) return(True);
}
return(False);
}
init()で複雑な計算や履歴の読み込みがあったり、ターミナルにたくさんのインジケーターやExpert Advisorがぶら下がっていたり...。
が、コードの初期化中に端末が割り込んでくると、ログに「......」というエラーが表示されます。タイムアウト
ターミナルでログを見てエラーがなければ、初期化が成功したことになります。 start()関数自体の確認は簡単で、最初の行に start(): Print("new tick") と書けばよいのです。
しました(((o(*゚▽゚*)o)))
そう、多くの情報を揺さぶり、計算も、ダニの実験も...。
計算には2~3分かかり、MTは「ハングしない」、すべてが普通に動作し、Print() とAlertからのメッセージが表示され、その後すべてが表示される)
MTからのメッセージをすべて見てみましたが、エラーは見つかりませんでした...。
ご協力お願いします。
計算には2~3分かかり、MTは「ハング」せず、すべてが普通に動作し、Print()とAlertメッセージが表示され、その後すべてが表示されます))
Print()が出力されれば、start()は間違いなく動作しますが、計算が2-3分かかるという記述には困惑します。ターミナルにこのような負荷がかかる場合、関数sleep() を使って計算を中断しなければ、ターミナルは間違いなくハングアップします。
MT4にはデバッガがないので、怪しいコード部分にPrint()を挿入して、失敗したコード部分や失敗しなかった条件をキャッチします。
注文がTakeProfitまたはStopLossによってトリガーされるかどうかを確認するにはどうすればよいですか?ご返信ありがとうございました
Sayod さんは、どのような時間枠で、どのようなパラメータで取引されていますか?
何が違うのか、あるいは逆にしていてテストしたいのか?
デフォルトでh1での取引。
ピップステップ - 30
ロットエキスポ - 1.59
アイデアが実装されていれば、パラメータはあまり関係ないと思います、Expert Advisorはどんなパラメータでも良いと思います、IMHO。
TakeProfitまたはStopLossによってトリガーされたオープンオーダーの事実をコミットする必要があります。TakeProfitとStopLossの実際の値には興味がありません。
注文が発動した事実だけを登録したいのであれば、前のティックの注文 数を記憶し、次のティックの注文数と比較し、注文数が変化していれば、それは・・・ということです。
端末は「so:19.5%/28.4/145.8」というコメントとともに負け注文をクローズした。これはどういうことでしょうか?
Print()がプリントアウトした場合、確かにstart()は動作しています。しかし、計算に2-3分かかるという記述には困惑します。
MT4にはデバッガがないので、怪しいコード部分にPrint()を挿入して、失敗したコード部分や失敗しなかった条件をキャッチします。
すみません、勘違いしていました、Printは initの時のみ機能します。起動に入れない))
はい、各関数の最後に、それに関するメッセージと一緒にprintを置き、すべてがうまくいっているかどうかをチェックしました。 そして、すべてのメッセージ(すべての関数)は、initの終わりまで100%機能しましたが、スタートに行くことができません!(笑)。
回答ありがとうございました。
両方の関数のコードをよく理解し、実行速度と特定のタスクのために最適化するためにそれらを1つに統合する...
すみません、言い間違えました、Printはiniteでしか使えません。スタートに入れない))
はい、各関数の終わりに、それに関するメッセージのプリントを挿入して、すべてがうまくいっているかどうかをチェックします。 そして、すべてのメッセージ(すべての関数)は、initの終わりまで100%動作していますが、スタートに行くことができません!(笑)。
回答ありがとうございました。
率直に言って、端末に刻みがないわけです。つまり、接続されていないか、オフラインのチャートで作業しているか、initでIsExpertEnabled() を確認し、許可されていなければEAを有効にしてください。