编码帮助 - 页 242

 
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
 
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)。

}

 
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的结果(这意味着在这种情况下,没有类似价格的订单)。

 
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)。

}

然后为短线再做一个?

 
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"

 
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)

//----
 
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);

}

它现在应该能正常工作了

 
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。

 

你好,Mladen,

能否请您看一下这段代码,我试图选择最后一笔订单,并根据最后的开仓价 开出额外的订单。一切似乎都在工作,除了

IfOrderDoesNotExist7(); IfOrderDoesNotExist5()。

似乎相互干扰,如果我应该像下面这样注释其中一个,订单就能正常工作。

// IfOrderDoesNotExist7();

IfOrderDoesNotExist5()。

你能告诉我我做错了什么吗?

附加的文件:
564.mq4  10 kb
 
sulaimoney:
你好,Mladen ,

能否请您看一下这段代码,我试图选择最后一笔订单,并根据最后的开盘价开出其他订单。一切似乎都在工作,除了

IfOrderDoesNotExist7(); IfOrderDoesNotExist5()。

似乎相互干扰,如果我应该像下面这样注释其中一个,订单就能正常工作。

// IfOrderDoesNotExist7();

IfOrderDoesNotExist5();

你能告诉我我做错了什么吗?

苏莱曼

我认为问题不在于这两个函数,而在于新的metatrader 4检查布尔条件的方式(如果你在使用metatrader 4的一些新版本)。简化了一下代码,解决了一个需要严格定义布尔条件的地方。试试吧

附加的文件:
564_1.mq4  10 kb