我如何正确地开立市场订单? - 页 5 123456789 新评论 Alexey Viktorov 2017.02.03 18:42 #41 Gennady Mazur:我最近提出了一个关于重开订单的话题。我以为我已经解决了这个问题,因为一个星期以来一切工作都非常顺利。但今天我遇到了一个类似的问题,只是在打开时。 在Finam上有很多订单,在Otkritie上有9个订单......尽管在所有情况下都应该只有一个订单开盘。下面是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开立整堆的订单。我 在打开订单 的函数中检查 是否有积极的回应,以及是否已经收到了订单票据,但由于某些原因,这个函数返回错误,尽管订单实际上已经设定。解释一下问题出在哪里,如何解决这个问题? 此外,你可以通过尝试选择一个位置来检查其开盘情况。而且最好能多试几次。 int n = 0; do { n++; } while(!PositionSelectByTicket(tradeResult.deal) && n < 5); 既有延迟,也有确认立场已经到位的情况。 我还注意到,没有检查OrderCheck(Request, checkResult),这很糟糕。 prostotrader 2017.02.03 18:46 #42 哦,也是在市场秩序中--价格=0Request.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 18:54 #43 Alexey Viktorov: 此外,还可以通过尝试选择来检查位置的开放。而且最好能多试几次 int n = 0; do { n++; } while(!PositionSelectByTicket(tradeResult.deal) && n < 5); 既有延迟,也有确认已经开仓的情况。 我还注意到,没有检查OrderCheck(Request, checkResult),这很糟糕。如果这个职位已经存在了呢?或者,如果已经有一个头寸,但订单没有被完全填满? Gennady Mazur 2017.02.03 20: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 20:15 #45 prostotrader:哦,也是在市场秩序中--价格=0Request.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 07:28 #46 Sergey Chalyshev:重复进行除此以外,你还应该检查订单的状态,以及它是否已经出现在历史上。交易所不使用头寸,只使用订单。 真的吗? Dmitry Fedoseev 2017.02.04 07:33 #47 Gennady Mazur: 如果我下的是挂单,你是对的,但我是按市场工作的,这里的票是用Results.deal 获得的。 还是先发送订单,然后再执行。 Dmitry Fedoseev 2017.02.04 07:35 #48 Sergey Chalyshev:我不明白你的微笑是什么意思?我没有想到会听到你这么说。什么停顿,还是你在开玩笑? 在OrderSend() 之后暂停,以便可以更新市场信息和历史。 Dmitry Fedoseev 2017.02.04 07:41 #49 Sergey Chalyshev:坏的外汇遗产。... 你可能要小心你的措辞。否则,我们还不如谈论FOORTS信徒的基因变异。 Alexey Viktorov 2017.02.04 08:01 #50 Sergey Chalyshev:如果这个职位已经存在了呢?还是已经有了一个位置,但订单没有完全填满? 是的,而且我都是为了我的对冲。我承认我说得不太对。或者完全错误。:-) 123456789 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我最近提出了一个关于重开订单的话题。我以为我已经解决了这个问题,因为一个星期以来一切工作都非常顺利。但今天我遇到了一个类似的问题,只是在打开时。
在Finam上有很多订单,在Otkritie上有9个订单......尽管在所有情况下都应该只有一个订单开盘。
下面是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开立整堆的订单。
我 在打开订单 的函数中检查 是否有积极的回应,以及是否已经收到了订单票据,但由于某些原因,这个函数返回错误,尽管订单实际上已经设定。
解释一下问题出在哪里,如何解决这个问题?
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 获得的。
我不明白你的微笑是什么意思?
我没有想到会听到你这么说。什么停顿,还是你在开玩笑?
坏的外汇遗产。
...
如果这个职位已经存在了呢?
还是已经有了一个位置,但订单没有完全填满?