как заставить закрывать ордер по сигналу iMACD? - страница 2 12 Новый комментарий narvere 2010.03.30 16:45 #11 В продолжении темы... кое что я переделал, все равно не закрывает позицию :) Может поможете исправить ситуацию? Заранее спасибо!//---- input parameters extern double Lots=0.1; extern double MACD_present; extern double MACD_last; extern int MagicNumber=501; bool CheckOrders(int Type) { bool Result=True; for(int i=0;i<OrdersTotal();i++) if(OrderSelect(i,SELECT_BY_POS)) if(OrderMagicNumber()==MagicNumber && OrderSymbol() == Symbol()) if(OrderType()==Type) { if(Type==OP_BUY) if(!OrderClose(OrderTicket(),OrderLots(),Bid,0)) Result=False; if(Type==OP_SELL) if(!OrderClose(OrderTicket(),OrderLots(),Ask,0)) Result=False; } else Result=False; return(Result); } int start() { int total; int i; int ticket; int Percent =10; // % свободных средств double Free =AccountFreeMargin(); // свободные стредства double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED); //стоимость одного лота double Step =MarketInfo(Symbol(),MODE_LOTSTEP); // шаг размера double Lots_New =MathFloor(Free*Percent/100/One_Lot/Step)*Step; bool ret; MACD_present = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); // Вычисление текущее значения MACD MACD_last = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); // Вычисление прошлое значения MACD total=OrdersTotal(); //всего открытых ордеров if(total<1) // открываем позицию, если нет ниодной открытой позиции //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ { if(AccountFreeMargin()<(1000*Lots_New)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ if (MACD_present>0 && MACD_last<0) //Buy if(CheckOrders(OP_SELL)) { if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 10, 0, 0, NULL, MagicNumber)) Print("Не открыт ордер Buy. Ошибка №", GetLastError()); Comment("_ticket=", ticket ); } if (MACD_present<0 && MACD_last>0) //Sell if(CheckOrders(OP_BUY)) { if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 10, 0, 0, NULL, MagicNumber)) Print("Не открыт ордер Sell. Ошибка №", GetLastError()); Comment("_ticket=", ticket ); } }} return; igor 2010.03.30 17:34 #12 bool CheckOrders(int Type) { bool Result=True; for(int i=0;i<OrdersTotal();i++) if(OrderSelect(i,SELECT_BY_POS)) if(OrderMagicNumber()==MagicNumber && OrderSymbol() == Symbol()) if(OrderType()==Type) { if(Type==OP_BUY) int ret=OrderClose(OrderTicket(),OrderLots(),Bid,0) if (ret<0) Result=False; else return; // если неудачно if(Type==OP_SELL) int ret2=OrderClose(OrderTicket(),OrderLots(),Ask,0) if (ret2<0) Result=False; else return; // если неудачно } else Result=False; return(Result); Может так. narvere 2010.03.30 17:48 #13 Все равно ордера закрывать советник не хочет. Привожу последнюю версию кода с поправками zhuki. //---- input parameters extern double Lots=0.1; extern double MACD_present; extern double MACD_last; extern int MagicNumber=501; bool CheckOrders(int Type) { bool Result=True; for(int i=0;i<OrdersTotal();i++) if(OrderSelect(i,SELECT_BY_POS)) if(OrderMagicNumber()==MagicNumber && OrderSymbol() == Symbol()) if(OrderType()==Type) { if(Type==OP_BUY) int ret=OrderClose(OrderTicket(),OrderLots(),Bid,0); if (ret<0) Result=False; // если неудачно if(Type==OP_SELL) int ret2=OrderClose(OrderTicket(),OrderLots(),Ask,0); if (ret2<0) Result=False; // если неудачно } else Result=False; return(Result); } int start() { int total; int i; int ticket; int Percent =10; // % свободных средств double Free =AccountFreeMargin(); // свободные стредства double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED); //стоимость одного лота double Step =MarketInfo(Symbol(),MODE_LOTSTEP); // шаг размера double Lots_New =MathFloor(Free*Percent/100/One_Lot/Step)*Step; bool ret; MACD_present = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); // Вычисление текущее значения MACD MACD_last = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); // Вычисление прошлое значения MACD total=OrdersTotal(); //всего открытых ордеров if(total<1) // открываем позицию, если нет ниодной открытой позиции //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ { if(AccountFreeMargin()<(1000*Lots_New)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ if (MACD_present>0 && MACD_last<0) //Buy if(CheckOrders(OP_SELL)) { if(!OrderSend(Symbol(), OP_BUY, Lots_New, Ask, 10, 0, 0, NULL, MagicNumber)) Print("Не открыт ордер Buy. Ошибка №", GetLastError()); Comment("_ticket=", ticket ); } if (MACD_present<0 && MACD_last>0) //Sell if(CheckOrders(OP_BUY)) { if(!OrderSend(Symbol(), OP_SELL, Lots_New, Bid, 10, 0, 0, NULL, MagicNumber)) Print("Не открыт ордер Sell. Ошибка №", GetLastError()); Comment("_ticket=", ticket ); } }} return; narvere 2010.03.30 18:07 #14 походу никому мою "задачу" не решить :) igor 2010.03.30 18:09 #15 Написано через ...поэтому narvere 2010.03.30 18:13 #16 хаха)) верю ) ппц, что думаете всё так безнадежно? narvere 2010.03.30 18:14 #17 он же входит в рынок более-менее "нормально"... подскажите хоть словами, что стоит подправить? а с кодом я сам повожусь тогда... Пожалуйстааа!! igor 2010.03.30 18:24 #18 У вас логика такая если нет позиций, есть сигнал, то закроем существующую и откроем противоположную. Это надо еще догадаться. narvere 2010.03.30 18:29 #19 если проблема только в этом, то постараюсь её исправить. тут конечно полезно сделать работу над ошибками) igor 2010.03.30 18:32 #20 Тут не работа над ошибками нужна,а работа с планированием самого алгоритма. 12 Новый комментарий
Может поможете исправить ситуацию?
Заранее спасибо!
Может так.
Привожу последнюю версию кода с поправками zhuki.
ппц, что думаете всё так безнадежно?
тут конечно полезно сделать работу над ошибками)