закрытие и отмена ордеров

 

люди. Помогите пожалуйста. Уже все пальцы истёр. Написал вот такую штуку. 

extern int startHour=0;

extern int endHour=10;

extern double PercentSL=100;

extern int FixSL=20;

extern int metodSL=1;//Метод расчета уровня SL - 1-процент от ширины канала;

                     //...2-фиксированный

extern int metodTP=1;//Метод расчета уровня TP - 1-процент от ширины канала;

                     //...2-фиксированный

extern int FixTP=100;

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

//| expert initialization function                                   |

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

//----------блок параметров нового ордера

double OPB;// цена открытия buy stop

double OPS;// цена открытия sell stop

double SLB;// stopLoss--buy stop

double TPB;// TakeProffit--buy stop

double SLS;// stopLoss--sell stop

double TPS;// TakeProffit--sell stop

datetime Cansel;//время отмены ордеров

//--------------------------------------------------------------------


bool Trade;

double Filter;

double HCannel;

double LCannel;

bool CannelDefined;

//--------------------------------------------------------------- 1 --

// Функция учёта ордеров

// Глобальные переменные:

double Mas_Ord_New[31][9];   // Массив ордеров последний известный

double Mas_Ord_Old[31][9];   // Массив ордеров предыдущий (старый)

                        // 1й индекс = порядковый номер ордера 

                        // [][0] не определяется

                        // [][1] курс откр. ордера (абс.знач.курса)

                        // [][2] StopLoss ордера   (абс.знач.курса)

                        // [][3] TakeProfit ордера (абс.знач.курса)

                        // [][4] номер ордера        

                        // [][5] колич. лотов орд. (абс.знач.курса)

                        // [][6] тип орд. 0=B,1=S,2=BL,3=SL,4=BS,5=SS

                        // [][7] магическое число ордера

                        // [][8] 0/1 факт наличия комментария

int Mas_Tip[6];           // Массив колич. ордеров всех типов

                        // [] тип орд: 0=B,1=S,2=BL,3=SL,4=BS,5=SS

                        

int init()

  {

//----

   

//----

   return(0);

  }

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

//| expert deinitialization function                                 |

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

int deinit()

  {

//----

   

//----

   return(0);

  }

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

//| expert start function                                            |

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

int start()

  {

//----1

   Terminal();//проверяем наличие ордеров

   if(Mas_Ord_New[0][0]==0)

   {Trade=true;// если их нет торговля разрешена

  HLCannel();

   }

    else Trade=false;//если есть торговля запрещена

//----

if ((CannelDefined==true)&& (Trade==true))

   NewOrders();

   return(0);

  }

  

//==============|| Функция учёта ордеров  ||==========================

int Terminal()

  {

   int Qnt=0;                          // Счётчик количества ордеров

 

//--------------------------------------------------------------- 3 --

   ArrayCopy(Mas_Ord_Old, Mas_Ord_New);// Сохраняем предыдущую историю

   Qnt=0;                              // Обнуление счётчика ордеров

   ArrayInitialize(Mas_Ord_New,0);     // Обнуление массива

   ArrayInitialize(Mas_Tip,    0);     // Обнуление массива

//--------------------------------------------------------------- 4 --

   for(int i=0; i<OrdersTotal(); i++) // По рыночн. и отлож. ордерам

     {

      if((OrderSelect(i,SELECT_BY_POS)==true)     //Если есть следующ.

      && (OrderSymbol()==Symbol()))               //.. и наша вал.пара

        {

         //------------------------------------------------------ 5 --

         Qnt++;                                   // Колич. ордеров

         Mas_Ord_New[Qnt][1]=OrderOpenPrice();    // Курс открытия орд

         Mas_Ord_New[Qnt][2]=OrderStopLoss();     // Курс SL

         Mas_Ord_New[Qnt][3]=OrderTakeProfit();   // Курс ТР

         Mas_Ord_New[Qnt][4]=OrderTicket();       // Номер ордера

         Mas_Ord_New[Qnt][5]=OrderLots();         // Количество лотов

         Mas_Tip[OrderType()]++;                  // Кол. ордеров типа

         Mas_Ord_New[Qnt][6]=OrderType();         // Тип ордера

         Mas_Ord_New[Qnt][7]=OrderMagicNumber();  // Магическое число 

         if (OrderComment()=="")

            Mas_Ord_New[Qnt][8]=0;                // Если нет коммент

         else

            Mas_Ord_New[Qnt][8]=1;                // Если есть коммент

         //------------------------------------------------------ 6 --

        }

     }

   Mas_Ord_New[0][0]=Qnt;                         // Колич. ордеров

//--------------------------------------------------------------- 7 --

   return;

  }

//====================================================================

double HLCannel()

   int HIndex;//индекс мвксимального бара в канале

   int LIndex;// индекс минимального бара в канале

   int BarCannel=endHour-startHour;

if(Hour()==endHour+1)

{

HIndex=iHighest(NULL,PERIOD_H1,2,BarCannel,1);

LIndex=iLowest(NULL,PERIOD_H1,1,BarCannel,1);

HCannel=NormalizeDouble (High[HIndex],Digits);

LCannel=NormalizeDouble(Low[LIndex],Digits);

CannelDefined=true;

}else CannelDefined=false; return;

return;

}

//====================================================================

int NewOrders()


{

//11111111111111111111111111111111111111111111111111111111111111

// блок расчета параметров ордера

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

//|    double OPB;// цена открытия buy stop         |

//|    double OPS;// цена открытия sell stop        |

//|    double SLB;// stopLoss--buy stop             |

//|    double TPB;// TakeProffit--buy stop          |

//|    double SLS;// stopLoss--sell stop            |

//|    double TPS;// TakeProffit--sell stop         |

//|    datetime Cansel;//время отмены ордеров       |

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


OPB=HCannel;

OPS=LCannel;

//--SLB

if (metodSL==1)//процент от канала

{

double sb=HCannel-((HCannel-LCannel)*(PercentSL/100));

SLB= NormalizeDouble(sb,Digits);

}else if(metodSL==2)//Фиксированный

      {

        SLB= HCannel-(FixSL*Point);

      }else Print("Метод расчета SL не определен");

//--SLS

if (metodSL==1)//процент от канала

{

double ss=LCannel+((HCannel-LCannel)*(PercentSL/100));

SLS=NormalizeDouble(ss,Digits);

}else if(metodSL==2)//Фиксированный 

      {

         SLS= LCannel+(FixSL*Point);  

      }else Print("Метод расчета SL не определен");

//--TPB

if(metodTP==1)//Процент от канала

{

double tb=HCannel+((HCannel-LCannel)*(PercentSL/100));

TPB= NormalizeDouble(tb,Digits);

}else if(metodTP==2)

      {

         TPB= HCannel+(FixTP*Point);

      }else Print("Метод расчета TP не определен");

//--TPS

if(metodTP==1)//Процент от канала

{

double ts=LCannel-((HCannel-LCannel)*(PercentSL/100));

TPS= NormalizeDouble(ts,Digits);

}else if(metodTP==2)

      {

         TPS= HCannel-(FixTP*Point);

      }else Print("Метод расчета TP не определен");

//--Cansel


//---блок расстановки ордеров

if (Mas_Tip[4]==0)

OrderSend(Symbol(),4,1,OPB,5,SLB,TPB,NULL,0,0,Green);

if (Mas_Tip[5]==0)

OrderSend(Symbol(),5,1,OPS,5,SLS,TPS,NULL,0,0,Red);

return;

}

 а теперь никак не могу до думаться как его заставить закрывать все позиции. т.е как отложенные так и рыночные в определенное время. Желательно по переменной extern. заранее спасибо.

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