编码帮助 - 页 242 1...235236237238239240241242243244245246247248249...786 新评论 Mladen Rakic 2014.03.12 11:18 #2411 Mastercash: 谁能告诉我,我做错了什么,下面的代码是2个EMA交叉的警报。它拒绝工作。请谁能帮助我在MT4 build 600+上编译和工作。#财产版权 "wnk" #property link "www.wnk.com" #属性 indicator_chart_window #属性 indicator_buffers 2 #属性 indicator_color1 Lime #属性 indicator_color2 Red //--- 缓冲区 double ExtMapBuffer1[]; double ExtMapBuffer2[]; //外部变量...... //+------------------------------------------------------------------+ //|自定义指标初始化函数 //+------------------------------------------------------------------+ int init() { //---- 指标 SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,217); SetIndexBuffer(0,ExtMapBuffer1); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW)。 SetIndexArrow(1,217); SetIndexBuffer(1,ExtMapBuffer2); SetIndexEmptyValue(1,0.0)。 //---- 返回(0)。 } //+------------------------------------------------------------------+ //|自定义指标去初始化功能| //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //|自定义指标迭代函数| //+------------------------------------------------------------------+ int start() { static datetime LastAlertTime = TimeCurrent(); int counted_bars=IndicatorCounted(), 限度。 如果(counted_bars<0) 返回(-1)。 如果(counted_bars>0) counted_bars--。 limit=Bars-counted_bars。 while(limit) { double ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0)。 double ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0)。 double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1); double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1); double mom=iMomentum(NULL,0,14,PRICE_CLOSE,0); double b4mom=iMomentum(NULL,0,14,PRICE_CLOSE,1); //上升警报 if((LastAlertTime!=Time[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(mom>b4mom)&&(mom>98.6591)) ExtMapBuffer1[limit]=High[limit]+5*Point。 LastAlertTime = Time[0]; Alert(Symbol()," ",Period(), "M Price UP")。 //卖出警报 if((LastAlertTime!=Time[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(mom<b4mom)&&(mom<100.6872)) ExtMapBuffer2[limit]=Low[limit]-5*Point。 LastAlertTime = Time[0]; Alert(Symbol()," ",Period(), "M价格下跌")。 } return(0); } //+------------------------------------------------------------------+ 掌握现金 现在试试吧 附加的文件: _test_mc.mq4 3 kb Axel Franzen 2014.03.12 11:30 #2412 mladen: 阿克塞尔它可以做到。 简单的说,未结订单应该被扫描为所需的类型,其开仓价格应该与所需的新开仓价格进行比较,或者将其开仓的条形图与作为开仓标准的条形图进行比较。 编辑:似乎我忘了添加函数。 对于不同的 "i=OrdersTotal()-1",写一个类似下面的函数20次左右,然后在所有的函数中调用,并与新的开盘价 相匹配,这是否可行? double OpenOrderPrice() { double TempOrderPrice = 0; for(int i=OrdersTotal()-1;i>=0;i--) { 如果(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)) 如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { TempOrderPrice = OrderOpenPrice()。 } } return(TempOrderPrice)。 } 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 为什么我的EA在回测时一直给出负利润? EA不会在多对上运行,需要帮助 Mladen Rakic 2014.03.12 11:48 #2413 BlackCoq: 编辑:似乎我忘了添加这个函数。对于不同的 "i=OrdersTotal()-1",写一个类似下面的函数20次左右,然后在所有的函数中调用,并与新的开盘价相匹配,这样做是否可行? double OpenOrderPrice() { double TempOrderPrice = 0; for(int i=OrdersTotal()-1;i>=0;i--) { 如果(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)) 如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { TempOrderPrice = OrderOpenPrice()。 } } return(TempOrderPrice)。 } 试试这样的方法: double OpenOrderPrice(double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); break; } } return(TempOrderPrice); } 黑客攻击(BlackCoq 你必须输入应该开仓的价格和与该价格的最大偏差(绝对值:例如不是5点,而是5*_Point),如果差异小于或等于该价格偏差,它将返回以该近似价格开仓的订单价格。否则,它将返回-1的结果(这意味着在这种情况下,没有类似价格的订单)。 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 EA不会在多对上运行,需要帮助 Coding help Axel Franzen 2014.03.12 13:42 #2414 mladen: 试试这样的方法。double OpenOrderPrice(double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); break; } } return(TempOrderPrice); } 黑猫 你必须输入应该开仓的价格和与该价格的最大偏差(绝对值:例如不是5点,而是5*_Point),如果差额小于或等于该价格偏差,它将返回以该近似价格开仓的订单价格。否则,它将返回-1的结果(这意味着在这种情况下,没有类似价格的订单)。 因此,如果我想检查是否有任何未结订单与我想买入的价格有2个点的偏差,我调用这个函数。 double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { 如果(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)) 如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { 如果(MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); priceDeviation = 2*Point; priceToCompareTo = Ask; 休息。 } } 返回(TempOrderPrice)。 } 然后为短线再做一个? 问吧! 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. Mladen Rakic 2014.03.12 14:12 #2415 BlackCoq: 因此,如果我想检查是否有任何未结订单偏离我想买入的价格2个点,我调用这个函数。double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { 如果(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)) 如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { 如果(MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); priceDeviation = 2*Point; priceToCompareTo = Ask; 休息。 } } 返回(TempOrderPrice)。 } 然后再做一个短裤? 不 你像这样调用函数: 如果(OpenOrderPrice(OP_BUY,Ask ,2.0*_Point)==-1)允许多头和 如果(OpenOrderPrice(OP_SELL,Ask,2.0*_Point)==-1)允许空头。 调用应该来自你的代码部分,在那里你有一个逻辑来打开一个订单。 但是,这个函数必须是不同的(像这样)。 double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)) if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); break; } } return(TempOrderPrice); } 该函数现在涵盖了两种情况,你不应该改变函数中的代码。 ___________________ PS: _Point变量在metatrader 4的旧版本中不存在。上面的例子是为新的metatrader4编写的。如果你使用旧版本(509或更早),那么"_Point "应该是 "Point" 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 问吧! 任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. Axel Franzen 2014.03.12 17:36 #2416 mladen: 没有你像这样调用这个函数。 调用应该来自你的代码部分,在那里你有一个逻辑来打开一个订单。 但是,这个函数必须是不同的(像这样)。 这个函数现在涵盖了两种情况,你不应该改变函数中的代码。 ___________________ PS: _Point变量在metatrader 4的旧版本中不存在。上面的例子是为新的metatrader4编写的。如果你使用旧版本(509或更早),那么"_Point "应该是 "Point" 谢谢你。我把这个函数复制到EA中,并按照你写的方法调用它,但由于某些原因,即使在新价格的偏差范围内还有其他仓位,它也会开仓。该函数是检查所有的开仓价格,还是只检查最新的价格? 包括下面这个EA。 //+------------------------------------------------------------------+//| expert start function | //+------------------------------------------------------------------+ int start() { //---- bool result; PipsUntilNextCandle--; DisplayUserFeedback(); if (OldBars != Bars) { PipsUntilNextCandle = RenkoBoxSize; OldBars = Bars; DoesTradeExist(); double take; double stop; RefreshRates(); //Have the last candles risen , 1=last candle , 2 = last two candles if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1)) { if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits); if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits); result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber); if (!result) OldBars = 0; } //if (Open[0] > Open[2]) //Have the last candles fallen , , 1=last candle , 2 = last two candles if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1)) { if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits); if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits); result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber); if (!result) OldBars = 0; }//if (Open[0] > Open[2]) }//if (OldBars != Bars) //---- Coding help [存档!]我将免费撰写任何专家或指标。 [存档!]任何菜鸟问题,为了不给论坛添乱。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 2. Mladen Rakic 2014.03.12 17:57 #2417 BlackCoq: 谢谢你。我把这个函数复制到EA中,并按照你写的方法调用,但由于某些原因,即使在新价格的偏差范围内还有其他的仓位,它也会打开。该函数是检查所有的开仓价格,还是只检查最新的价格?包括下面这个EA。 //+------------------------------------------------------------------+//| expert start function | //+------------------------------------------------------------------+ int start() { //---- bool result; PipsUntilNextCandle--; DisplayUserFeedback(); if (OldBars != Bars) { PipsUntilNextCandle = RenkoBoxSize; OldBars = Bars; DoesTradeExist(); double take; double stop; RefreshRates(); //Have the last candles risen , 1=last candle , 2 = last two candles if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1)) { if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits); if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits); result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber); if (!result) OldBars = 0; } //if (Open[0] > Open[2]) //Have the last candles fallen , , 1=last candle , 2 = last two candles if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1)) { if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits); if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits); result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber); if (!result) OldBars = 0; }//if (Open[0] > Open[2]) }//if (OldBars != Bars) //---- 该函数 代码中存在一个错误。我以为OrderSelect()对位置起作用,而没有检查它。使用这个。 double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); break; } } return(TempOrderPrice); } 它现在应该能正常工作了 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 EA不会在多对上运行,需要帮助 如何编码? Axel Franzen 2014.03.12 22:03 #2418 mladen: 该函数代码中存在一个错误。我以为OrderSelect()对位置起作用,没有检查。请使用这个函数。double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation) { double TempOrderPrice = -1; for(int i=OrdersTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation) TempOrderPrice = OrderOpenPrice(); break; } } return(TempOrderPrice); } 现在应该能正常工作了 因此,它确实如此。再次感谢你的伟大工作,Mladen。 SuLaimon 2014.03.13 09:17 #2419 你好,Mladen, 能否请您看一下这段代码,我试图选择最后一笔订单,并根据最后的开仓价 开出额外的订单。一切似乎都在工作,除了 IfOrderDoesNotExist7(); IfOrderDoesNotExist5()。 似乎相互干扰,如果我应该像下面这样注释其中一个,订单就能正常工作。 // IfOrderDoesNotExist7(); IfOrderDoesNotExist5()。 你能告诉我我做错了什么吗? 附加的文件: 564.mq4 10 kb Mladen Rakic 2014.03.13 10:12 #2420 sulaimoney: 你好,Mladen ,能否请您看一下这段代码,我试图选择最后一笔订单,并根据最后的开盘价开出其他订单。一切似乎都在工作,除了 IfOrderDoesNotExist7(); IfOrderDoesNotExist5()。 似乎相互干扰,如果我应该像下面这样注释其中一个,订单就能正常工作。 // IfOrderDoesNotExist7(); IfOrderDoesNotExist5(); 你能告诉我我做错了什么吗? 苏莱曼 我认为问题不在于这两个函数,而在于新的metatrader 4检查布尔条件的方式(如果你在使用metatrader 4的一些新版本)。简化了一下代码,解决了一个需要严格定义布尔条件的地方。试试吧 附加的文件: 564_1.mq4 10 kb 1...235236237238239240241242243244245246247248249...786 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
谁能告诉我,我做错了什么,下面的代码是2个EMA交叉的警报。它拒绝工作。请谁能帮助我在MT4 build 600+上编译和工作。
#财产版权 "wnk"
#property link "www.wnk.com"
#属性 indicator_chart_window
#属性 indicator_buffers 2
#属性 indicator_color1 Lime
#属性 indicator_color2 Red
//--- 缓冲区
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//外部变量......
//+------------------------------------------------------------------+
//|自定义指标初始化函数
//+------------------------------------------------------------------+
int init()
{
//---- 指标
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW)。
SetIndexArrow(1,217);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0)。
//----
返回(0)。
}
//+------------------------------------------------------------------+
//|自定义指标去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//|自定义指标迭代函数|
//+------------------------------------------------------------------+
int start()
{
static datetime LastAlertTime = TimeCurrent();
int counted_bars=IndicatorCounted(),
限度。
如果(counted_bars<0)
返回(-1)。
如果(counted_bars>0)
counted_bars--。
limit=Bars-counted_bars。
while(limit)
{
double ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0)。
double ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0)。
double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1);
double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);
double mom=iMomentum(NULL,0,14,PRICE_CLOSE,0);
double b4mom=iMomentum(NULL,0,14,PRICE_CLOSE,1);
//上升警报
if((LastAlertTime!=Time[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(mom>b4mom)&&(mom>98.6591))
ExtMapBuffer1[limit]=High[limit]+5*Point。
LastAlertTime = Time[0];
Alert(Symbol()," ",Period(), "M Price UP")。
//卖出警报
if((LastAlertTime!=Time[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(mom<b4mom)&&(mom<100.6872))
ExtMapBuffer2[limit]=Low[limit]-5*Point。
LastAlertTime = Time[0];
Alert(Symbol()," ",Period(), "M价格下跌")。
}
return(0);
}
//+------------------------------------------------------------------+掌握现金
现在试试吧
阿克塞尔
它可以做到。
简单的说,未结订单应该被扫描为所需的类型,其开仓价格应该与所需的新开仓价格进行比较,或者将其开仓的条形图与作为开仓标准的条形图进行比较。编辑:似乎我忘了添加函数。
对于不同的 "i=OrdersTotal()-1",写一个类似下面的函数20次左右,然后在所有的函数中调用,并与新的开盘价 相匹配,这是否可行?
double OpenOrderPrice()
{
double TempOrderPrice = 0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
如果(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice()。
}
}
return(TempOrderPrice)。
}
编辑:似乎我忘了添加这个函数。
对于不同的 "i=OrdersTotal()-1",写一个类似下面的函数20次左右,然后在所有的函数中调用,并与新的开盘价相匹配,这样做是否可行?
double OpenOrderPrice()
{
double TempOrderPrice = 0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
如果(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice()。
}
}
return(TempOrderPrice)。
}试试这样的方法:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
黑客攻击(BlackCoq
你必须输入应该开仓的价格和与该价格的最大偏差(绝对值:例如不是5点,而是5*_Point),如果差异小于或等于该价格偏差,它将返回以该近似价格开仓的订单价格。否则,它将返回-1的结果(这意味着在这种情况下,没有类似价格的订单)。
试试这样的方法。
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
黑猫
你必须输入应该开仓的价格和与该价格的最大偏差(绝对值:例如不是5点,而是5*_Point),如果差额小于或等于该价格偏差,它将返回以该近似价格开仓的订单价格。否则,它将返回-1的结果(这意味着在这种情况下,没有类似价格的订单)。因此,如果我想检查是否有任何未结订单与我想买入的价格有2个点的偏差,我调用这个函数。
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
如果(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
如果(MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Ask;
休息。
}
}
返回(TempOrderPrice)。
}
然后为短线再做一个?
因此,如果我想检查是否有任何未结订单偏离我想买入的价格2个点,我调用这个函数。
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
如果(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
如果(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
如果(MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Ask;
休息。
}
}
返回(TempOrderPrice)。
}
然后再做一个短裤?不
你像这样调用函数:
如果(OpenOrderPrice(OP_BUY,Ask ,2.0*_Point)==-1)允许多头和
如果(OpenOrderPrice(OP_SELL,Ask,2.0*_Point)==-1)允许空头。
调用应该来自你的代码部分,在那里你有一个逻辑来打开一个订单。
但是,这个函数必须是不同的(像这样)。
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
该函数现在涵盖了两种情况,你不应该改变函数中的代码。
___________________
PS: _Point变量在metatrader 4的旧版本中不存在。上面的例子是为新的metatrader4编写的。如果你使用旧版本(509或更早),那么"_Point "应该是 "Point"
没有
你像这样调用这个函数。
调用应该来自你的代码部分,在那里你有一个逻辑来打开一个订单。
但是,这个函数必须是不同的(像这样)。
这个函数现在涵盖了两种情况,你不应该改变函数中的代码。
___________________
PS: _Point变量在metatrader 4的旧版本中不存在。上面的例子是为新的metatrader4编写的。如果你使用旧版本(509或更早),那么"_Point "应该是 "Point"谢谢你。我把这个函数复制到EA中,并按照你写的方法调用它,但由于某些原因,即使在新价格的偏差范围内还有其他仓位,它也会开仓。该函数是检查所有的开仓价格,还是只检查最新的价格?
包括下面这个EA。
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----谢谢你。我把这个函数复制到EA中,并按照你写的方法调用,但由于某些原因,即使在新价格的偏差范围内还有其他的仓位,它也会打开。该函数是检查所有的开仓价格,还是只检查最新的价格?
包括下面这个EA。
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----该函数 代码中存在一个错误。我以为OrderSelect()对位置起作用,而没有检查它。使用这个。
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
它现在应该能正常工作了
该函数代码中存在一个错误。我以为OrderSelect()对位置起作用,没有检查。请使用这个函数。
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
因此,它确实如此。再次感谢你的伟大工作,Mladen。
你好,Mladen,
能否请您看一下这段代码,我试图选择最后一笔订单,并根据最后的开仓价 开出额外的订单。一切似乎都在工作,除了
IfOrderDoesNotExist7(); IfOrderDoesNotExist5()。
似乎相互干扰,如果我应该像下面这样注释其中一个,订单就能正常工作。
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5()。
你能告诉我我做错了什么吗?
你好,Mladen ,
能否请您看一下这段代码,我试图选择最后一笔订单,并根据最后的开盘价开出其他订单。一切似乎都在工作,除了
IfOrderDoesNotExist7(); IfOrderDoesNotExist5()。
似乎相互干扰,如果我应该像下面这样注释其中一个,订单就能正常工作。
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
你能告诉我我做错了什么吗?苏莱曼
我认为问题不在于这两个函数,而在于新的metatrader 4检查布尔条件的方式(如果你在使用metatrader 4的一些新版本)。简化了一下代码,解决了一个需要严格定义布尔条件的地方。试试吧