Во-первых, я знаю, Raptor, что вы уже поднимали этот вопрос со мной раньше, но я не могу вспомнить, где вы это писали, и, что более важно, понять, где я ошибаюсь?
Насколько я знаю, я писал правильно, чтобы советник, прикрепленный к любой соответствующей паре, мог всегда работать только на этой паре. На данный момент я заметил, что GBPCAD и GBPUSD, похоже, не ладят друг с другом, то есть стоплосс GBPCAD думает, что его расчет производится по паре GBPUSD... поэтому при срабатывании отложенного ордера стоплосс переходит от значений GBPCAD к значениям cable.....
Я использую magicnumber==1234;
Любые предложения или области, в которых я веду себя как идиот, пожалуйста, не стесняйтесь выделить :(
Ваша проблема ясна, но ее трудно понять из-за того, как вы используете отступы в скобках и условия. ... вы делаете это:
for(int b=OrdersTotal()-1; b>=0; b--) { if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue; if(OrderType()==OP_BUYSTOP) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) // if the symbol matches do . . . if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR) // . . . . this { Stored_BuyPrice = OrderOpenPrice(); // and this DeleteOrder = OrderDelete(OrderTicket()); // and this } if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order. // this happens even if the symbol didn't match . . . { int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,Stored_BuyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green); if(NewBuyOrder == -1)Print("New Buy Order Last Error = ",GetLastError()); } }
Я думаю, что вы имели в виду следующее...
for(int b=OrdersTotal()-1; b>=0; b--) { if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue; if( OrderType() == OP_BUYSTOP && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() ) { if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) { Stored_BuyPrice = OrderOpenPrice(); DeleteOrder = OrderDelete(OrderTicket()); } if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder) // If there are no open orders = place a new order. { int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green); if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError()); } } }
Спасибо, что подсказали мне этот момент :)
А, хорошо - такую маленькую мелочь я упустил. Также, когда вызывается первая функция OrderSend(), делаю ли я что-то не так? Я спрашиваю об этом, потому что пытаюсь логически подумать, знает ли она в этот момент, на какую пару нужно отправить ордер? Возможно, это глупый вопрос, но я не делаю ничего плохого в этой части, не так ли? Часть функции отправки "BuyTicketOrder"?
Спасибо, что подсказали мне этот момент :)
//+----------------------------------------------------------------------------------------------------------------------------------------+ //Moving Average Trailing Stop Function //+----------------------------------------------------------------------------------------------------------------------------------------+ void MA_Trail() { double ATR = iATR(NULL,60,14,1); double MA = iMA(NULL,60,MA_Period,0,1,0,1); double BuyStopPriceMath = MA - ATR; double SellStopPriceMath = MA + ATR; double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5); double SellStopPrice = NormalizeDouble(SellStopPriceMath,5); //buy order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price. for(int b=OrdersTotal()-1; b>=0; b--) { if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) if(OrderType()==OP_BUY) { if(OrderStopLoss() > BuyStopPrice)break; if(OrderStopLoss() < BuyStopPrice) bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE); if(BuyModify < 0)Print(" Buy Trailing Stop Failed: ", GetLastError()); } } //sell order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price. for(int s=OrdersTotal()-1; s>=0; s--) { if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) if(OrderType()==OP_SELL) { if(OrderStopLoss() < SellStopPrice)break; if(OrderStopLoss() > SellStopPrice) bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE); if(SellModify < 0)Print(" Sell Trailing Stop Failed: ", GetLastError()); } } }Хорошо - я думаю, что именно это и было причиной проблемы. Я только что обновил код в этой части и, кажется, теперь он перестал щелкать на каждом тике от цены кабеля до цены GBPCAD... Теперь он застрял на одной стоп-цене, пока не обновится на этом часовом закрытии... так что я подтвержу.
Вам это кажется нормальным? Также, поскольку у меня есть эти частичные закрытия ордеров, я предполагаю, что мне, вероятно, нужно дважды проверить, что скобки находятся в правильном положении относительно "OrderSymbol()==Symbol())"?
if(OpenOrdersThisPair(Symbol()) == 0Сколько раз вы хотите вызвать это? Для каждого ордера (ваш код)? Для каждого отложенного ордера на текущем графике (код RaptorUK)? Или ОДИН раз, после того как вы сохраните и удалите отложенный ордер?
Хорошо - я думаю, это то, что вызывало проблему. Я только что обновил код в этой части и, кажется, теперь он перестал щелкать на каждом тике от цены кабеля до цены GBPCAD... Теперь он застрял на одной стоп-цене, пока не обновится на этом часовом закрытии... так что я подтвержу.
Вам это кажется нормальным? Также, поскольку у меня есть эти частичные закрытия ордеров, я предполагаю, что мне, вероятно, нужно дважды проверить, что скобки находятся в правильном положении относительно "OrderSymbol()==Symbol())"?
Выглядит нормально, да, всегда проверяйте свои скобки и облегчайте себе жизнь, где только можно, если это означает добавление скобок, то сделайте это, но старайтесь быть последовательным в использовании скобок и отступов.
Вам не нужно два цикла, достаточно одного...
//+----------------------------------------------------------------------------------------------------------------------------------------+ //Moving Average Trailing Stop Function //+----------------------------------------------------------------------------------------------------------------------------------------+ void MA_Trail() { double ATR = iATR(NULL,60,14,1); double MA = iMA(NULL,60,MA_Period,0,1,0,1); double BuyStopPriceMath = MA - ATR; double SellStopPriceMath = MA + ATR; double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5); double SellStopPrice = NormalizeDouble(SellStopPriceMath,5); for(int b=OrdersTotal()-1; b>=0; b--) { if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { //buy order section - This is where the stop will trail based // upon a fixed point value stated on the EA. It will trail with price. if(OrderType()==OP_BUY) { if(OrderStopLoss() > BuyStopPrice) break; if(OrderStopLoss() < BuyStopPrice) bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE); if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError()); } // sell order section - This is where the stop will trail based // upon a fixed point value stated on the EA. It will trail with price. if(OrderType()==OP_SELL) { if(OrderStopLoss() < SellStopPrice) break; if(OrderStopLoss() > SellStopPrice) bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE); if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError()); } } }
OrderModify() возвращает bool, true или false, а не int... поэтому SellModify никогда не будет меньше 0.... Вчера я напечатал то же самое на ForexFactory .
Каждый раз, когда ордер был удален - а я хочу, чтобы отложенный ордер удалялся КАЖДЫЙ раз после закрытия часового бара, а затем открывался новый ордер с теми же параметрами, ИЛИ, если применимо, с новыми стопами, целями и размером лота на основе "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0,0)".) - ATR) "
Единственное, что мне нужно сохранить для НОВОГО отложенного ордера (после удаления), это начальная цена входа на этом конкретном сетапе.(Stored_BuyPrice = OrderOpenPrice();)
Это забавно, потому что первый бит кода выше также связан с другой темой, которую я собирался опубликовать. Вместо того, чтобы создавать новую тему с аналогичным вопросом, я задам его здесь, если вы не против? Посмотрите ссылку ниже - это всего лишь двухминутное видео, объясняющее проблему, которая у меня возникла и которую мне трудно решить...
Я написал так много кода, но теперь начинаю понимать, что дело в неэффективности, которую мне приходится устранять...
Видео: http://screencast.com/t/4nl8AaH8Sag
Если я сделал это действительно двусмысленно, предоставив лишь ограниченный объем кода, то я добавлю еще немного?
Каждый раз, когда ордер был удален - а я хочу, чтобы отложенный ордер удалялся КАЖДЫЙ раз после закрытия часового бара, а затем открывался новый ордер с теми же параметрами, ИЛИ, если применимо, с новыми стопами, целями и размером лота на основе "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0,0)".) - ATR) "
Единственное, что мне нужно сохранить для НОВОГО отложенного ордера (после удаления), это начальная цена входа на этом конкретном сетапе.(Stored_BuyPrice = OrderOpenPrice();)
Это забавно, потому что первый бит кода выше также связан с другой темой, которую я собирался опубликовать. Вместо того, чтобы создавать новую тему с аналогичным вопросом, я задам его здесь, если вы не против? Посмотрите ссылку ниже - это всего лишь двухминутное видео, объясняющее проблему, которая у меня возникла и которую мне трудно решить...
Я написал так много кода, но теперь начинаю понимать, что дело в неэффективности, которую мне приходится устранять...
Видео: http://screencast.com/t/4nl8AaH8Sag
Если я сделал это действительно двусмысленно, предоставив лишь ограниченное количество кода, то я добавлю еще немного?
Откат к 21 ЕМА происходит только один раз. После этого он перестанет искать любые откаты к 21 ЕМА. Однако, что он должен делать, так это следить за тем, чтобы текущий открытый ордер PENDING точно соответствовал лотам, стопам и тейк-профитам ПОСЛЕ каждого часового закрытия. Однако я не могу понять, почему иногда он работает безупречно и обновляет отложенный ордер после каждого закрытия H1, а иногда нет? Причина, по которой отложенный ордер обновляется, заключается в том, что ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0, 0.) - ATR) ".
Если это не так, то он не обновится - КАК бы то ни было, есть бесчисленное количество случаев, когда это так, но он не удалит ордер и не поставит новый с новыми значениями?
Не уверен, что вы можете увидеть что-то в этом коде выше относительно видео? (Первый код, который вы исправили). Надеюсь, так понятнее?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Насколько я знаю, я писал правильно, чтобы советник, прикрепленный к любой соответствующей паре, мог всегда работать только на этой паре. На данный момент я заметил, что GBPCAD и GBPUSD, похоже, не ладят друг с другом, то есть стоплосс GBPCAD думает, что его расчет производится по паре GBPUSD... поэтому при срабатывании отложенного ордера стоплосс переходит от значений GBPCAD к значениям cable.....
Я использую magicnumber==1234;
Любые предложения или области, в которых я веду себя как идиот, пожалуйста, не стесняйтесь выделить :(