как заставить закрывать ордер по сигналу iMACD?
Ну хоть кто-нибудь, ответьте?
А что тут отвечать? Ошибка на ошибке сидит и ошибкой погоняет.
1. Где проверка на длинную или короткую?
2. Что за переменная ticket и где ей присваивается значение?
3. По какой цене должна закрываться короткая, а по какой длинная?
Это только то, что я заметил, мельком глянув на Ваше "произведение". Возможно есть еще баги.
Закрывают так
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
if (OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY && Условие )
ret=OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);
if (OrderType()==OP_SELL && Условие )
ret=OrderClose(OrderTicket(),OrderLots(),Ask,0,CLR_NONE);
}}
Если условие верно . Добавите своё.
Перебирать надо ордера,что бы найти тот который нужен
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
if (OrderSymbol()==Symbol())
{
if (OrderType()==OP_BUY && Условие )
ret=OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);
if (OrderType()==OP_SELL && Условие )
ret=OrderClose(OrderTicket(),OrderLots(),Ask,0,CLR_NONE);
}}
Если условие верно . Добавите своё.
Перебирать надо ордера,что бы найти тот который нужен
вот мой весь советник. первая часть - покупка - работает, а остальное не работает.
очень хотелось бы доделать советник.
заранее спасибо!
очень хотелось бы доделать советник.
заранее спасибо!
//+------------------------------------------------------------------+/ extern double MACD_present; extern double MACD_last; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int total; int i; double 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 { ticket=OrderSend (Symbol(), OP_BUY, Lots_New, Ask,0,0,0, "MACD!", 123, 0, Green); Comment("_ticket=", ticket ); } if (MACD_present<0 && MACD_last>0) //Sell { ticket=OrderSend (Symbol(), OP_SELL, Lots_New, Bid,0,0,0, "MACD!", 123, 0, Green); Comment("_ticket=", ticket ); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //else //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ if(total == 1) // закрываем позицию, если есть открытая позиция /*{ if(OrderSelect(ticket,SELECT_BY_POS)==true) { if (MACD_present<0 && MACD_last>0) //Close korotkuju { Print("Смена тренада 1 "); OrderClose(ticket,OrderLots(),Bid,3,Red); return(0); } if (MACD_present>0 && MACD_last<0) //Close dlinnuju { Print("Смена тренада 2 "); OrderClose(ticket,OrderLots(),Ask,3,Red); return(0); } } */ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ } } return;
Для тебя принципиально именно этот текст, здесь ошибки будешь долго исправлять. Особенно если не знаешь. Может тебе похожее подойдёт.
Я сам не программист, но самостоятельно и с помощью форума пытаюсь осуществить эту идею. очень надо :)
#include <stdlib.mqh> #include <stderror.mqh> extern double Lots = 0.5; extern int SL = 50; extern int TP = 50; int r,ret,B,S,N=0; int init() { } int start() { int Orders_B=0,Orders_S=0,Tic_B=0,Tic_S=0; B=0;S=0; //Проверим что имеем for(int r=0;r<OrdersTotal();r++) // { if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES)==false) continue; if(OrderSymbol()==Symbol() && OrderMagicNumber()==111999) { if (OrderType()==OP_BUY) {Orders_B++;Tic_B=OrderTicket();} if (OrderType()==OP_SELL) {Orders_S++;Tic_S=OrderTicket();} }} // Возьмём сигнал int Sig=Signal(); //if (Sig==0) return(0); if (Sig==1 && Tic_B==0 ) ret=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Cross_MA",111999,0,Blue); if (Sig==2 && Tic_S==0) ret=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL*Point,Bid-TP*Point,"Cross_MA",111999,0,Red); if (Sig==2 && Tic_B!=0) OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); if (Sig==1 && Tic_S!=0) OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE); for(int r1=0;r1<OrdersTotal();r1++) // { if(OrderSelect(r1,SELECT_BY_POS,MODE_TRADES)==false) continue; if(OrderSymbol()==Symbol() && OrderMagicNumber()==111999) { if (OrderType()==OP_BUY ) { if (Bid-OrderStopLoss()>(SL+5)*Point) ret=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+5*Point,OrderTakeProfit(),0,CLR_NONE); if (Signal()==2) OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); } if (OrderType()==OP_SELL) { if (Signal()==1) OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE); if (OrderStopLoss()-Ask>(SL+5)*Point) ret=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()-5*Point,OrderTakeProfit(),0,CLR_NONE); } }} } // Это функция сигнала меняй что хочешь int Signal() { double MACD_S=iMACD(NULL,0,12,26,1,PRICE_CLOSE,MODE_SIGNAL,0); if (MACD_S>0) return (1); if (MACD_S<0) return (2); return(0); }Вроде работает, условия вроде твои. Попробуй,если чего не так пиши исправлю. Вообще условия свои можешь поставить.
спасибо, сейчас посмотрю.
по подобию этого кода написал код выхода из рынка тоже по сигналу IMACD - но этот не работает. кусок кода привожу ниже. что можно было бы подправить? Заранее спасибо!