你需要过滤 交易。 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; // These else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;// four else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; // lines else PointValue = MarketInfo(OrderSymbol(), MODE_POINT); // Execute only on Symbol orders. double lots = NormalizeDouble(OrderLots() * Multiplier, 2); // This and below are always executed if (OrderType() == OP_BUY) // Symbol is irrelevant.
用大括号。 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) { // Rest of code executes only on Symbol orders. if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; else PointValue = MarketInfo(OrderSymbol(), MODE_POINT); double lots = NormalizeDouble(OrderLots() * Multiplier, 2); if (OrderType() == OP_BUY) : }
在4位数的经纪人身上,点=0.0001 if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
固定和简化。 PointValue = MarketInfo(OrderSymbol(), MODE_POINT); if(MarketInfo(OrderSymbol(), MODE_DIGITS) % 2 = 1) PointValue *= 10;
- 由于大括号内的所有内容都是Symbol(),每个MarketInfo都可以用预定义的变量 来代替
不要硬编码数字。 检查你的返回代码什么是函数返回值 ?我如何使用它们?-MQL4论坛 和MQL4程序中的常见错误以及如何避免这些错误 - MQL4文章 | result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*0.0001, 0, "Original", magicNumber, 0, Blue); |
1.非常感谢您的帮助。 我已经按照建议添加了一个支架,但EA仍然只在一个货币对 上打开交易。 它不会在其他任何图表上打开交易,即使买入条件已经满足。 我已经在这个问题上卡了几个星期,请您再看看。
2.编辑:不再需要了
3.我的代码现在看起来是这样的
int start() { { if (OrdersTotal() == 0) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } for(int i=OrdersTotal()-1; i>=0; i--) { //calculate new lotsize of hedge based on lotsize of current open trade*Multiplier double lots = NormalizeDouble(OrderLots() * Multiplier, 2); if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(OrdersTotal() == 1) result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
if (OrdersTotal() == 0) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*PointValue, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError());如果一个订单在任何货币对上打开,它将不会打开另一个订单,直到OrdersTotal()==0再次出现。
如果一个订单在任何货币对上打开,它将不会打开另一个订单,直到OrdersTotal()==0再次出现。
谢谢你的帮助。我需要将第一笔原始订单限制在只有一笔交易。 我不希望EA在满足买入条件时继续开单。 所以我添加了Orderstotal来限制。 然而,这段代码似乎与这里的代码有干扰
else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(OrdersTotal() == 1) //<---------- result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError());
在这里,我只想让EA在每笔开仓交易中打开一个对冲,因此OrderTotal ==1
那么,什么是限制交易数量的最佳方法,即一个原始交易和一个对冲交易? 谢谢你
Trader3000: 那么,那么什么是限制交易数量的最佳方式,即一个原始交易和一个对冲交易? |
|
非常感谢大家的帮助。 我已经解决了这个问题,现在当买入条件得到满足时,EA会在所有的图表上打开交易,然而,这下面的东西现在都不工作了。 EA没有调用Trailingstop或Hedge功能。 请有人看一下,让我知道我做错了什么,因为我无法弄清楚。
int start() { double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); double lots = NormalizeDouble(OrderLots() * Multiplier, 2); total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) { result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(total == 1) result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); double lots = NormalizeDouble(OrderLots() * Multiplier, 2);
我不知道你到底在做什么,但我建议你避免用唯一不同的大写字母来命名两个变量。这很容易混淆这两个变量,尤其是当其他人在阅读你的代码时,很可能已经采用了以大写字母开头的变量为Globalscope的惯例。
没有选择订单,所以OrderLots()可以是任何东西
if (OrderType() == OP_BUY)
谢谢你的回答。 我想做的是让EA开出第一笔原始交易,其手数是我资产的一个百分比。 如果交易违背了
我,EA必须在相反的方向上打开一个对冲,但这里的手数必须是原始手数(OrderLots)的3倍。 尽管看起来好像没有选择任何
我现在将手数直接放在OrderSend函数 中,但无论是尾随止损还是后退止损,都不影响操作。
时,就会触发对冲。在我添加这个之前,两者都工作得很好
total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; }
int start() { double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(total == 1) result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
我相信我的大括号{}的位置不对
非常感谢你们到目前为止对我的帮助,我正在取得进展。 我现在有了它,一切似乎都在按照它应该的方式工作,除了EA忽略了开启对冲交易的条件。它有时(但不总是)打开对冲交易,即使条件没有得到满足。 另外,追踪止损并不总是生效。 我想我仍然在某个地方缺少大括号{}。 我的代码现在看起来像这样。 谁能帮我看一下,谢谢你。
int start() { total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) { result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) //<------- THIS IS BEING IGNORED SOMETIMES (I THINK) if(total == 1) { result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); } } // else if (OrderType() == OP_SELL) // ...
GumRai。
This would use the values from the last order selected in the previous loop, it may not be the correct magic number or symbol.
大家好,我已经尝试了论坛上的所有建议,但似乎都不奏效。 谁能帮帮我? 我相信问题出在我的OrderTotal功能上。 我正在交易10个货币对,也就是说,我在10个图表上打开了EA。 这是一个简单的对冲策略。 我希望EA能根据信号打开交易(多头或空头)。如果交易按照我的方式进行,那么跟踪止损或止盈。 然而,如果交易对我不利,我希望它在相反的方向上开出交易。 我使用的代码似乎是有效的,但有时它会被卡住,即不再开出任何交易。 此外,当一个货币对上有一个或两个交易,它似乎不想在任何其他货币对上开出任何交易。
以下是我的代码