成行注文を正しく発注するにはどうしたらよいですか? - ページ 5 123456789 新しいコメント Alexey Viktorov 2017.02.03 17:42 #41 Gennady Mazur:先日、注文の再開についてトピックを立てました。1週間ほど順調に動作していたので、問題は解決したと思っていました。しかし、今日、開くときだけ同じような問題が発生しました。 Finamでは多くの注文が、Otkritieでは9つの注文が開きました...いずれも1つの注文しか開いていないはずですが。以下は、EAからのコードスニペットです。 if(OpenOrders<1) { Coment="Open Sell "+string(OpenOrders+1); ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling); } if(ret) { OpenOrders++; PriceLastOpen=price; }bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK){ MqlTradeRequest Request; MqlTradeResult Results; ZeroMemory(Request); ZeroMemory(Results); Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); Request.action=TRADE_ACTION_DEAL; Request.type=ORDER_TYPE_SELL; Request.symbol=symbol; Request.volume=volume; Request.deviation=deviation; Request.comment=comment; Request.type_filling=filling; bool res=false; res=OrderSend(Request,Results); if(res) { if(Results.deal>0) return(true); else return(false); } return(false);}つまり、操作が成功すれば、変数OpenOrdersが 増加し、最初は0に なることがコードからわかる。0より大きい場合は、それ以上の注文のオープンはないはずですが、Order1というコメントで注文の山全体がオープンされます。注文を 開く関数で肯定的な応答があるかどうか、注文チケットが届いているかどうかをチェック しますが、実際には注文が設定されているにもかかわらず、なぜかこの関数はfalseを返します。何が問題なのか、どうすれば解決できるのかを説明してください。 さらに、ポジションを選択してみることで、そのポジションの開き具合を確認することができます。そして、何度かトライするのがよいでしょう。 int n = 0; do { n++; } while(!PositionSelectByTicket(tradeResult.deal) && n < 5); 遅延と、すでにその位置にあることの確認の両方があります。 また、OrderCheck(Request, checkResult)のチェックがないのもまずいことに気がつきました。 prostotrader 2017.02.03 17:46 #42 あ、あとマーケットオーダーで価格=0にすることもRequest.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); 忘 れてください。bool SendOrderSyncMode() { MqlTradeRequest request={0}; MqlTradeResult result={0}; order_ticket=0; request.action = TRADE_ACTION_DEAL; request.magic = 9876543211; request.symbol = Symbol(); request.volume = 1; request.price = 0; request.type=ORDER_TYPE_BUY; request.comment="Sync mode"; request.type_filling=ORDER_FILLING_FOK; request.type_time=ORDER_TIME_DAY; if(OrderSend(request,result)) { if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED)) { if(result.order>0) { order_ticket=result.order; Print(__FUNCTION__," Order sent in sync mode"); return(true); } else { Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode); } } else { Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode); } } else { Print(__FUNCTION__," Order not sent in sync mode."); } return(false); }void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { switch(trans.type) { case TRADE_TRANSACTION_HISTORY_ADD: if((order_ticket > 0) && (trans.order == order_ticket)) { //Вот здесь и смотрим что произошло } break; } } How do I open フォルツァ執行上の問題点 FORTS SLとTP Sergey Chalyshev 2017.02.03 17:54 #43 Alexey Viktorov: また、実際に選択してみることで、ポジションの開き具合を確認することも可能です。そして、何度か試してみるのがよいでしょう int n = 0; do { n++; } while(!PositionSelectByTicket(tradeResult.deal) && n < 5); 遅延と、すでにポジションが開いていることの確認の両方があります。 また、OrderCheck(Request, checkResult)のチェックがないのもまずいことに気がつきました。もし、そのポジションがすでに存在していたとしたら?あるいは、すでにポジションがあるにもかかわらず、注文が完全に満たされていない場合は? Gennady Mazur 2017.02.03 19:12 #44 Alexey Viktorov: また、実際に選択してみることで、ポジションの開き具合を確認することができます。そして、何度か試行錯誤を重ねた方が良い。 int n = 0; do { n++; } while(!PositionSelectByTicket(tradeResult.deal) && n < 5); 遅れていることと、すでに位置が確定していることの両方があります。 また、OrderCheck(Request, checkResult)のチェックがないことに気がつきましたが、これはまずいですね。まあ、多分私はOrderCheck(Request, checkResult)を挿入します ありがとうございました。しかし、私はこのようなループは特に好き ではありません。 Gennady Mazur 2017.02.03 19:15 #45 prostotrader:あ、あとマーケットオーダーで価格=0にすることもRequest.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); 忘 れてください。bool SendOrderSyncMode() { MqlTradeRequest request={0}; MqlTradeResult result={0}; order_ticket=0; request.action = TRADE_ACTION_DEAL; request.magic = 9876543211; request.symbol = Symbol(); request.volume = 1; request.price = 0; request.type=ORDER_TYPE_BUY; request.comment="Sync mode"; request.type_filling=ORDER_FILLING_FOK; request.type_time=ORDER_TIME_DAY; if(OrderSend(request,result)) { if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED)) { if(result.order>0) { order_ticket=result.order; Print(__FUNCTION__," Order sent in sync mode"); return(true); } else { Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode); } } else { Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode); } } else { Print(__FUNCTION__," Order not sent in sync mode."); } return(false); }void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { switch(trans.type) { case TRADE_TRANSACTION_HISTORY_ADD: if((order_ticket > 0) && (trans.order == order_ticket)) { //Вот здесь и смотрим что произошло } break; } } こんなに詳しい説明...本当にありがとうございます...。 そして、価格についてですが、そうですね、MT4の方が慣れていますし、そこでは常に価格を入れなければならないので...。 Dmitry Fedoseev 2017.02.04 06:28 #46 Sergey Chalyshev:繰り返しそれとは別に、注文の状況や 履歴にすでに表示されているかどうかも確認する必要があります。取引所はポジションを扱わず、注文のみを扱います。 そうなんですか? Dmitry Fedoseev 2017.02.04 06:33 #47 Gennady Mazur: 私が保留中の注文を置くならば、あなたは正しいですが、私は市場によって動作し、ここでチケットはResults.dealで 取得されます。 それでも、まず注文が送られ、次に実行される。 Dmitry Fedoseev 2017.02.04 06:35 #48 Sergey Chalyshev:あなたの笑顔の意味がわからないのですが?まさか、そんなことを言われるとは。何がポーズだ、冗談だろう?OrderSend()の 後、マーケット情報と履歴を更新できるように一時停止する。 Dmitry Fedoseev 2017.02.04 06:41 #49 Sergey Chalyshev:悪いFXの遺産。... 言い回しには気をつけたほうがいいかもしれませんね。そうでなければ、FOORTSの信奉者の遺伝子変異について話したほうがいいかもしれません。 Alexey Viktorov 2017.02.04 07:01 #50 Sergey Chalyshev:もし、そのポジションがすでに存在していたとしたら?それとも、すでにポジションはあるが、オーダーが完全に満たされていないのでしょうか? ああ、それに俺は生け垣が大事なんだ。確かに私は、ちょっとおかしいと思いました。あるいは全く間違っている。:-) 123456789 新しいコメント 理由: キャンセル 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
先日、注文の再開についてトピックを立てました。1週間ほど順調に動作していたので、問題は解決したと思っていました。しかし、今日、開くときだけ同じような問題が発生しました。
Finamでは多くの注文が、Otkritieでは9つの注文が開きました...いずれも1つの注文しか開いていないはずですが。
以下は、EAからのコードスニペットです。
{
Coment="Open Sell "+string(OpenOrders+1);
ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
}
if(ret)
{
OpenOrders++;
PriceLastOpen=price;
}
bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
MqlTradeRequest Request;
MqlTradeResult Results;
ZeroMemory(Request);
ZeroMemory(Results);
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
Request.action=TRADE_ACTION_DEAL;
Request.type=ORDER_TYPE_SELL;
Request.symbol=symbol;
Request.volume=volume;
Request.deviation=deviation;
Request.comment=comment;
Request.type_filling=filling;
bool res=false;
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
}
つまり、操作が成功すれば、変数OpenOrdersが 増加し、最初は0に なることがコードからわかる。
0より大きい場合は、それ以上の注文のオープンはないはずですが、Order1というコメントで注文の山全体がオープンされます。
注文を 開く関数で肯定的な応答があるかどうか、注文チケットが届いているかどうかをチェック しますが、実際には注文が設定されているにもかかわらず、なぜかこの関数はfalseを返します。
何が問題なのか、どうすれば解決できるのかを説明してください。
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
また、OrderCheck(Request, checkResult)のチェックがないのもまずいことに気がつきました。
あ、あとマーケットオーダーで価格=0にすることも
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); 忘 れてください。
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_ticket=0;
request.action = TRADE_ACTION_DEAL;
request.magic = 9876543211;
request.symbol = Symbol();
request.volume = 1;
request.price = 0;
request.type=ORDER_TYPE_BUY;
request.comment="Sync mode";
request.type_filling=ORDER_FILLING_FOK;
request.type_time=ORDER_TIME_DAY;
if(OrderSend(request,result))
{
if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
{
if(result.order>0)
{
order_ticket=result.order;
Print(__FUNCTION__," Order sent in sync mode");
return(true);
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Order not sent in sync mode.");
}
return(false);
}
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD:
if((order_ticket > 0) && (trans.order == order_ticket))
{
//Вот здесь и смотрим что произошло
}
break;
}
}
また、実際に選択してみることで、ポジションの開き具合を確認することも可能です。そして、何度か試してみるのがよいでしょう
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
また、OrderCheck(Request, checkResult)のチェックがないのもまずいことに気がつきました。
もし、そのポジションがすでに存在していたとしたら?
あるいは、すでにポジションがあるにもかかわらず、注文が完全に満たされていない場合は?
また、実際に選択してみることで、ポジションの開き具合を確認することができます。そして、何度か試行錯誤を重ねた方が良い。
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
また、OrderCheck(Request, checkResult)のチェックがないことに気がつきましたが、これはまずいですね。
まあ、多分私はOrderCheck(Request, checkResult)を挿入します
ありがとうございました。
しかし、私はこのようなループは特に好き ではありません。
あ、あとマーケットオーダーで価格=0にすることも
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); 忘 れてください。
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_ticket=0;
request.action = TRADE_ACTION_DEAL;
request.magic = 9876543211;
request.symbol = Symbol();
request.volume = 1;
request.price = 0;
request.type=ORDER_TYPE_BUY;
request.comment="Sync mode";
request.type_filling=ORDER_FILLING_FOK;
request.type_time=ORDER_TIME_DAY;
if(OrderSend(request,result))
{
if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
{
if(result.order>0)
{
order_ticket=result.order;
Print(__FUNCTION__," Order sent in sync mode");
return(true);
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Order not sent in sync mode.");
}
return(false);
}
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD:
if((order_ticket > 0) && (trans.order == order_ticket))
{
//Вот здесь и смотрим что произошло
}
break;
}
}
そして、価格についてですが、そうですね、MT4の方が慣れていますし、そこでは常に価格を入れなければならないので...。
繰り返し
それとは別に、注文の状況や 履歴にすでに表示されているかどうかも確認する必要があります。
取引所はポジションを扱わず、注文のみを扱います。
私が保留中の注文を置くならば、あなたは正しいですが、私は市場によって動作し、ここでチケットはResults.dealで 取得されます。
あなたの笑顔の意味がわからないのですが?
まさか、そんなことを言われるとは。何がポーズだ、冗談だろう?
悪いFXの遺産。
...
もし、そのポジションがすでに存在していたとしたら?
それとも、すでにポジションはあるが、オーダーが完全に満たされていないのでしょうか?