как заставить закрывать ордер по сигналу iMACD?

 
Написал код чтобы советник сам входил в рынок по сигналу iMACD - вроде работает
по подобию этого кода написал код выхода из рынка тоже по сигналу IMACD - но этот не работает. кусок кода привожу ниже. что можно было бы подправить? Заранее спасибо!

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);
 
Ну хоть кто-нибудь, ответьте?
 
narvere >>:
Ну хоть кто-нибудь, ответьте?

А что тут отвечать? Ошибка на ошибке сидит и ошибкой погоняет.


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

Если условие верно . Добавите своё.
Перебирать надо ордера,что бы найти тот который нужен
 
вот мой весь советник. первая часть - покупка - работает, а остальное не работает.

очень хотелось бы доделать советник.


заранее спасибо!

//+------------------------------------------------------------------+/

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; 
 
Для тебя принципиально именно этот текст, здесь ошибки будешь долго исправлять. Особенно если не знаешь. Может тебе похожее подойдёт.
 
Ну если у Вас есть что-то подобное в запасах, то можете предложить. На самом деле не хотелось бы удаляться от идеи: покупать, когда MACD меняет знак (из минусовой зоны переходит в плюсовую) и продавать, когда тренд меняется и знак MACD меняется на отрицательный.
 
Я сам не программист, но самостоятельно и с помощью форума пытаюсь осуществить эту идею. очень надо :)
 
#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);
}
Вроде работает, условия вроде твои. Попробуй,если чего не так пиши исправлю. Вообще условия свои можешь поставить.
 
спасибо, сейчас посмотрю.
 
narvere >>:
Ну хоть кто-нибудь, ответьте?

ticket double?

Причина обращения: