我尝试 ADD 在 MetaTrader 4 中止损我的公开市场订单当一个仓位获得100点时"到好的" 34;这等于订单开盘价;
OrderStopLoss() == OrderOpenPrice()
但这并没有发生。
我添加了Print()
& GetLastError()
函数,期刊中没有任何内容,因此它必须是我编码中的内容 - 但看不出会出现什么问题。
以下代码如下:
/*Breakeven Order Modification*/
bool BuyMod = true;
bool SellMod = true;
for(int b = OrdersTotal()-1;b>=0;b--)
{
if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
{
double aBidPrice = MarketInfo(Symbol(),MODE_BID);
double anOpenPrice = OrderOpenPrice();
double aNewTpPrice = OrderTakeProfit();
double aCurrentSL = OrderStopLoss();
double aNewSLPrice = anOpenPrice;
double pnlPoints = (aBidPrice - anOpenPrice)/_Point;
double stopPoints = (aBidPrice - aNewSLPrice)/_Point;
int stopLevel = int(MarketInfo(Symbol(),MODE_STOPLEVEL));
int aTicket = OrderTicket();
if(OrderType() == OP_BUY)
if(stopPoints >= stopLevel)
if(aTicket > 0)
if(pnlPoints >= breakeven)
if(aNewSLPrice != aCurrentSL)
{
BuyMod = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(aNewSLPrice,Digits),NormalizeDouble(aNewTpPrice,Digits),0,buycolor);
SendMail("Notification of Order Modification for Ticket#"+IntegerToString(OrderTicket(),10),"Good news! Order Ticket#"+IntegerToString(OrderTicket(),10)+"has been changed to breakeven");
}
}
}
for(int s = OrdersTotal()-1; s>=0; s--)
{
if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
{
double anAskPrice = MarketInfo(Symbol(),MODE_ASK);
double anOpenPrice = OrderOpenPrice();
double aNewTpPrice = OrderTakeProfit();
double aCurrentSL = OrderStopLoss();
double aNewSLPrice = anOpenPrice;
double pnlPoints = (anOpenPrice - anAskPrice)/_Point;
double stopPoints = (aNewSLPrice - anAskPrice)/_Point;
int stopLevel = int(MarketInfo(Symbol(),MODE_STOPLEVEL));
int aTicket = OrderTicket();
if(OrderType()== OP_SELL)
if(stopPoints >= stopLevel)
if(pnlPoints >= breakeven)
if(aNewSLPrice != aCurrentSL)
if(aTicket > 0)
{
SellMod = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(aNewSLPrice,Digits),NormalizeDouble(aNewTpPrice,Digits),0,sellcolor);
SendMail("Notification of Order Modification for Ticket#"+IntegerToString(OrderTicket(),10),"Good news! Order Ticket#"+IntegerToString(OrderTicket(),10)+"has been changed to breakeven");
}
}
}
交易算法交易mql4 metatrader4
shareeditdeleteflag
刚刚编辑
2天前问过
托德吉尔贝 264您可能想知道,StackOverflow不会提升重复的问题。 (见
答案 0 :(得分:1)
MQL4
语法规则外,还有更多条件:第一个隐患是数字四舍五入问题。
MetaQuotes,Inc。建议尽可能将浮动值标准化为适当的价格表示。
因此,如果价格进入服务器端指令 { OrderSend(), OrderModify(), ... }
,则始终准备此类aPriceDOMAIN
值<通过调用 NormalizeDouble( ... , _Digits )
,在标准化价格触及任何服务器端指令调用之前。
可能听起来很天真,但这个可以帮助您解决服务器端拒绝问题。
在常规基础上将NormalizeDouble()
次来电添加到您的代码中作为救生衣。
第二,即使是更好的隐患也在 STOP_ZONE
-s和 FREEZE_ZONE
-s < / p>
虽然不能直接看到,但任何经纪人都在各自的条款和条款中设置。条件这些参数。
在实践中,这意味着,如果您指示{ OrderSend() | OrderModify() }
设置 / 移动 aPriceDOMAIN
级别设置得太近当前实际 Ask
/ Bid
(违反经纪人禁止的STOP_ZONE
)
或
删除/修改已设置且现在已经设置的TP或SL的aPriceDOMAIN
级别,在距离实际 FREEZE_ZONE
/ <的经纪人禁止Ask
范围内strong> Bid
,这样的说明将无法成功接受并执行。
因此,除了拨打NormalizeDouble()
之外,随着价格的变动,总是等待一段时间。#34;远&#34;足够并定期检查是否违反了禁止的STOP_
+ FREEZE_
区域,然后在您的指定项目的订单管理部分进行任何修改。
无论如何,欢迎来到MQL4
Update:
虽然StackOverflow不是Do-a-Homework网站,但我想提出一些解决方案:
for ( int b = OrdersTotal() - 1; b >= 0; b-- ) // ________________________ // I AM NOT A FAN OF db.Pool-looping, but will keep original approach for context purposes
{ if ( ( OrderSelect( b, SELECT_BY_POS, MODE_TRADES ) ) == true )
{ // YES, HAVE TO OPEN A CODE-BLOCK FOR if()-POSITIVE CASE:
// ------------------------------------------------------
double aBidPRICE = MarketInfo( Symbol(), MODE_BID ); // .UPD
double anOpenPRICE = OrderOpenPrice(); // .SET FROM a db.Pool Current Record
double aNewTpPRICE = OrderTakeProfit(); // .SET FROM a db.Pool Current Record
double aCurrentSlPRICE = OrderStopLoss(); // .SET FROM a db.Pool Current Record
double aNewSlPRICE = anOpenPRICE; // .SET
double pnlPOINTs = ( aBidPRICE - anOpenPRICE )/_Point; // .SET
double stopPOINTs = ( aBidPRICE - aNewSlPRICE )/_Point; // .SET
// ------------------------------------------------------------ // .TEST
if ( OP_BUY == OrderType() )
if ( Period() == OrderMagicNumber() )
if ( stopPOINTa > stopLevel )
if ( pnlPOINTs >= breakeven )
if ( aNewSlPRICE != aCurrentSlPRICE )
{ // YES, HAVE TO OPEN A BLOCK {...}-CODE-BLOCK FOR THE if()if()if()if()-chain's-POSITIVE CASE:
// -------------------------------------------------------------------------------------------
int aBuyMOD = OrderModify( OrderTicket(),
OrderOpenPrice(),
NormalizeDouble( aNewSlPRICE, Digits ),
NormalizeDouble( aNewTpPRICE, Digits ),
0,
buycolor
);
switch( aBuyMOD )
{ case ( NULL ): { ...; break; } // FAIL ( ANALYSE ERROR )
default: { ...; break; } // PASS OrderModify()
}
}
}
答案 1 :(得分:0)
问题出在您对内置 OrderModify()
功能的调用中。
OrderStopLoss() == OrderModify()
将评估为 false
,从 ==
开始评估为0是一个比较运算符。
OrderStopLoss()
是对另一个内置函数(不是变量)的调用,您无法保存任何内容,因此 OrderStopLoss() = 4
强>也不会工作。
来自
MQL4
文档:
bool OrderModify( int ticket, // ticket
double price, // price
double stoploss, // stop loss
double takeprofit, // take profit
datetime expiration, // expiration
color arrow_color // color
);
如果您的情况如下,假设 ModBuy
已在代码中的某处定义:
ModBuy = OrderModify( OrderTicket(), // <-ticket from record OrderSelect()'d
OrderOpenPrice(), // <-price from current record
OrderOpenPrice(), // <-price from current record
OrderTakeProfit(), // <-TP from current record
0, // ( cannot set P/O expiration for M/O )
buycolor // ( set a color for a GUI marker )
);
或者您可以使用任何其他有效值而不是第二个 OrderOpenPrice()
来设置新的止损。
答案 2 :(得分:0)
我真的很抱歉,我是Stackoverflow的新手,这是我现在修改过的代码,基于每个人的评论&amp;推荐
$this->db->like($keyword);