このコードでは、関数OrderDeleteXとOrderSendXを使用しています。OrderDeleteとOrderSendは、取引スレッドが忙しくないかどうかをチェックし、EAのログに "Deleting order ..." や "Sending order ..." といったイベントを追加する標準のOrderDeleteとOrderSendのラッパーのようなものです。 コードをよりシンプルでわかりやすくするために、価格計算を削除しました。
if (OrderSelect(t1, SELECT_BY_TICKET)) {
if (OrderType() == OP_BUY) {
Print("--------------------------------------------------");
if (t2 > 0) OrderDeleteX(t2);
// Расчёты цены, стоплосса и тейкпрофита// .....
t3 = OrderSendX(Symbol(), OP_SELLSTOP, 0.02, Price1, slip, StopLoss, TakeProfit, "step 2", Magic, 0, ColorOrderSendSell);
}
} else {
Print("ERROR: Unknown order t1 in step 1");
restart(3);
}
if (OrderSelect(t2, SELECT_BY_TICKET)) {
if (OrderType() == OP_SELL) {
Print("--------------------------------------------------");
if (t1 > 0) OrderDeleteX(t1);
// Расчёты цены, стоплосса и тейкпрофита// .....
t3 = OrderSendX(Symbol(), OP_BUYSTOP, 0.02, Price1, slip, StopLoss, TakeProfit, "step 2", Magic, 0, ColorOrderSendBuy);
}
} else {
Print("ERROR: Unknown order t2 in step 1");
restart(4);
}
Лог терминала:
06:30:43 '2871084': delete pending order #119732180 sell stop 0.01 EURUSD at 1.46432 sl: 1.47032 tp: 1.43432
06:30:44 '2871084': request was accepted by server
06:30:44 '2871084': request in process
06:30:44 '2871084': pending order #119732180 was deleted
06:30:44 '2871084': pending order sell stop 0.02 EURUSD at 1.46032 sl: 1.46932 tp: 1.44082
06:30:44 '2871084': request was accepted by server
06:30:45 '2871084': request in process
06:30:45 '2871084': order was opened : #119733656 sell stop 0.02 EURUSD at 1.46032 sl: 1.46932 tp: 1.44082
Лог терминала:
10:15:35 '2871084': delete pending order #119899844 sell stop 0.01 EURCHF at 1.22245 sl: 1.22945 tp: 1.19735
10:15:35 '2871084': request was accepted by server
10:15:35 '2871084': request in process
10:15:36 '2871084': pending order #119899844 was deleted
10:15:36 '2871084': pending order sell stop 0.02 EURCHF at 1.21745 sl: 1.22845 tp: 1.20015
10:15:36 '2871084': request was accepted by server
10:15:36 '2871084': request in process
10:15:37 '2871084': order was opened : #119903758 sell stop 0.02 EURCHF at 1.21745 sl: 1.22845 tp: 1.20015
library FileGDV;
uses
SysUtils,
Classes;
//{$R *.res}
function FileExists(s:pchar):boolean; StdCall;
begin
result:=sysutils.fileexists(s);
end;
exports FileExists;
begin
end.
複雑でもなく、特別でもなく、ただひとつの機能。
この関数を使用するExpert Advisorのコードを以下に示します。
if (FileExists(s))
{
handleM=FileOpen(fn,FILE_BIN|FILE_WRITE|FILE_READ);
}
else
{
Alert("File not found "+s);
handleM=FileOpen(fn,FILE_BIN|FILE_WRITE);
s="Time;;M1;M5;M15;M30;H1;H4;D1\n";
FileWriteString(handleM,s,StringLen(s));
}
これは、ペアによってピップ値が異なるからです...。
利益(pips)表示モードでは、pip値は冗長だと思います。
ポイント値は「利益(pips)」表示モードでは冗長だと思うのですが
不具合は...。
1) Market Watchから不要な商品を削除し、再度追加すると、面白いことが起こります。
楽器上で右クリックし、"Chart Window "を選択すると、チャートが表示されます。
これで、選択した楽器とは別の楽器のチャートが開きます!!!!
このエラーが発生するためには、先ほど追加したツールから選択する必要があります。(スクリーンショット pic1, pic2, pic3 を参照)
2) 私のスクリーンショットでは、USDCHFの楽器が "Symbols "ウィンドウで選択されていることがわかりますが、実際には "Market Watch "にはありません。(pic4)
もしかしたら、1つ目の不具合は2つ目の不具合の影響かもしれません。Market Watchの商品の番号付けが間違っているのですから。
私はインターネットがとても苦手なので、すべてのスクリーンショットはアーカイブにあります。
以下、リンクhttp://www.sendspace.com/file/tbav73
不具合は...。
1) Market Watchから不要な商品を削除し、再度追加すると、面白いことが起こります。
楽器上で右クリックし、"Chart Window "を選択すると、チャートが表示されます。
これで、選択したツール以外のチャートが開きます!!!!
今日(というか昨日)の朝、MT4で奇妙な不具合が発生しました。あるExpert Advisorでチケット番号による注文をOrderSelectが見つけ られませんでした。
EAには、現在の価格の反対側に、BUY_STOPとSELL_STOPという2つの保留注文が 出されています。これらの注文のチケットはt1、t2に格納される。エラーが発生したコードでは、下図のように、これらの保留中の注文の1つが開かれると、2番目の注文が削除され、代わりに番号t3の次の保留中の注文が発注されるようになっています。t1 と t2 が最初に発注されたときにエラーがあった場合、誤発注されたチケットは注文リストにないはずです。これを if (OrderSelect ...) でチェックし、エラーの場合はログにメッセージを書き込んで restart() でシリーズを終了しています。
今日のt1は6:30にオープンしました。注文t2はExpert Advisorによって直ちに削除されました(マーケットからは削除されましたが、履歴には残りました-「キャンセルされました」と表示されました)。その後、t3が配置されました。これらの事象は、MTとEAのログに全て残っています。すると、"OrderSelect(t2, SELECT_BY_TICKET) "のチェックがFALSEを返し、"Unknown order t2 "のエラーでシリーズが異常終了してしまうのです。t2はエラーなく設定・削除され、履歴にも残ったので不思議です。MTの履歴モードは「全履歴」です。どうしてOrderSelectはそれを見つけられないのでしょうか?
コンピュータはスタンドアロンで、取引にのみ使用し、他には何もしません。私以外、誰も触れない。CPU負荷は平均10%。メモリ、ディスク容量などは十分な大きさです。
MT4のバージョンは402です。数ヶ月間、Expert Advisorは、デモ口座において、1つのMTで3つの異なるペア(3つのチャート)に対してリアルタイムで異なるバリエーションで動作しています。今朝まで、この部分のコードに問題はありませんでした。その後、午後から夕方にかけて、同じEAの他のペアでもすべてが順調に進みました。つまり、そのエラーは自由に再現することができないのです。
質問:どうしてこんなことが起こるのでしょうか?MTの不具合なのか、それとも私がコードに考慮しなかったことなのでしょうか?
このコードでは、関数OrderDeleteXとOrderSendXを使用しています。OrderDeleteとOrderSendは、取引スレッドが忙しくないかどうかをチェックし、EAのログに "Deleting order ..." や "Sending order ..." といったイベントを追加する標準のOrderDeleteとOrderSendのラッパーのようなものです。
コードをよりシンプルでわかりやすくするために、価格計算を削除しました。
変数での注文番号。
t2 = 119732180
t3 = 119733656
注文が見つからない。DCレポートから、オーダー67930924が開かれていたことがわかる...。
これらは、08.06.11以降の口座履歴にあるクローズドトレードです。
だから、オープントレードでなければならない。下の写真、オープントレードです。
しかし、ここにもない。明日、DCからどのような報告があるのか気になりますが、ソフトウェア開発者のバージョン、どうすればいいのか聞きたいですね。
そしてもうひとつ、どうでもいいことかもしれませんが、私の日付は保存されておらず、それに関する情報もありません。
注文が見つからない。DCレポートから、オーダー67930924が開かれていたことがわかる...。
これらは、08.06.11から始まる口座履歴のクローズド取引です。この注文はここにないことがわかります。
だから、オープントレードでなければならない。下の写真、オープントレードです。
しかし、ここにもない。明日、DCからどのような報告があるのか気になりますが、ソフトウェア開発者のバージョン、どうすればいいのか聞きたいですね。
そしてもうひとつ、どうでもいいことかもしれませんが、私の日付は保存されておらず、それに関する情報もありません。
テーマ「OrderSelectでチケット番号の注文が見つからなかった」の続きとして。
今朝、別のペアの同じExpert Advisorで同じエラーが発生しました。保留中の注文t2=#119899844が正常に発注され、同様に正常に削除された後、保留中の注文t3=#119903758が発注され、その後t2はOrderSelect関数で 見つからなくなりました。
昨日のエラーと今日のエラーの間に、Expert Advisorで前回のメッセージであげたコードが何度かエラーもなく正常に動作し、削除された注文も問題なく見つかりました。
その数ヶ月前から、このExpert AdvisorはバージョンMT4 229で動作していました。このようなことは、これまでにはなかったことです。4日前の週末に、バージョン402に切り替えました。エラーが新しいバージョンに関連しているかどうかはわかりません。というのも、このExpert Advisorが取引されているAlpariが引用のタイムゾーンを変更し、バージョン402だけがこの変更を正しく反映するからです(Alpariはそう主張しています)。
疑問は残ったままである。
履歴は全体が表示され、失われたオーダーはその中に見えるのに、なぜOrderSelectは履歴の中からオーダーを見つけられなかったのでしょうか?これはMTの不具合なのか、それとも私がコードの何かを見逃しているのか?
Delphi7で書かれたDLLがあります。機能はただ一つ、指定したパスにファイルがあるかどうかをチェックすることです。
以下はそのコードである。
複雑でもなく、特別でもなく、ただひとつの機能。
この関数を使用するExpert Advisorのコードを以下に示します。
そして、以下はヘッダーファイルのコードです。
以下は、ヘッダーファイルのコードです。ターミナルにExpert Advisorが1つしかない場合、すべてが時計のように動きます。
ターミナルで2つ 別のウィンドウでこの関数を呼び出すと、数時間おきに両方のEAが動かなくなり、ジャーナルにメッセージが表示されます。