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

 
В продолжении темы... кое что я переделал, все равно не закрывает позицию :)
Может поможете исправить ситуацию?
Заранее спасибо!
//---- 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; 
 
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); 

Может так.

	          
 
Все равно ордера закрывать советник не хочет.
Привожу последнюю версию кода с поправками 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; 
 
походу никому мою "задачу" не решить :)
 
Написано через ...поэтому
 
хаха)) верю )

ппц, что думаете всё так безнадежно?
 
он же входит в рынок более-менее "нормально"... подскажите хоть словами, что стоит подправить? а с кодом я сам повожусь тогда... Пожалуйстааа!!
 
У вас логика такая если нет позиций, есть сигнал, то закроем существующую и откроем противоположную. Это надо еще догадаться.
 
если проблема только в этом, то постараюсь её исправить.
тут конечно полезно сделать работу над ошибками)
 
Тут не работа над ошибками нужна,а работа с планированием самого алгоритма.
Причина обращения: