Скачать MetaTrader 5

Программисты, посодействууте с доработкой кода

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
В сервисе Фриланс выполнено тысячи оплачиваемых заказов. Присоединяйся!
Forex Trader
114255
Forex Trader 2007.08.16 14:23 
Помогите доработать эксперта. Есть эксперт, который выставляет ордера в зад. время и зацикл. скрипт, который нужно использовать для выставления ордеров, дабы избежать влияние отсутствия тиков в момент выставления ордера.

Спасибо

Эксперт:
extern int TakeProfit = 150;            
extern int StopLoss = 1;              
extern int lev= 10;  
extern int risk = 20;               
extern int HourOpen = 17;       
extern int MinutesOpen = 49;
extern int SecondsOpen = 30;
extern int HourClose = 14;
extern int MinutesClose = 0;
extern int SecondsClose = 1;

int  ho, mo,  so, Lots; 
int pos;
int init()
  {
   return(0);
  }
int deinit()
  {
   return(0);
  }
int start()
  {
mo=Minute(); 
so=Seconds(); 
ho=Hour(); 

   Lots=MathCeil(AccountBalance()*risk/10000.0)/10.0;
   if (Lots<0.1) Lots=0.1;  
  
//*-----------------------------------------------------------------------  
//|Блок выставления ордеров   
//*-----------------------------------------------------------------------
                        
if(mo==MinutesOpen && so>=SecondsOpen && ho==HourOpen)

       {
        if(OrderTotal(OP_BUYSTOP)==0)
       {
       OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+lev*Point,3,(Ask+lev*Point)-StopLoss*Point,Ask+(TakeProfit+lev)*Point,"Покупка",222,0,Blue);
       }
  
     if(OrderTotal(OP_SELLSTOP)==0)
       {
       OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-lev*Point,3,
                                          (Bid-lev*Point)+StopLoss*Point,
                                           Bid-(TakeProfit+lev)*Point,"Продажа",222,0,Red);
       }
     }
//|удаление всех ордеров по данному инструменту                    
   if(TimeHour(TimeCurrent())==HourClose && TimeMinute(TimeCurrent())>=MinutesClose && TimeSeconds(TimeCurrent())>=SecondsClose)//и здесь тоже может не сработать
     {
     for(pos=OrdersTotal()-1; pos>=0; pos--)
       {
       if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
         {
         if(OrderSymbol()==Symbol())
           {
           if(OrderType()==OP_BUY)
              {
              OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Blue); 
              } 
              if(OrderType()==OP_SELL)
              {
              OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Red); 
              }
              if(OrderType()==OP_BUYSTOP)
              {
              OrderDelete(OrderTicket(),Blue); 
              }
              if(OrderType()==OP_SELLSTOP)
              {
              OrderDelete(OrderTicket(),Red);
              }
           }               
         }
       else
         Print("Ошибка ", GetLastError());
       }
     }
   return(0);
  }
int OrderTotal(int type)
  {
  int order=0;
  for(int pos=OrdersTotal()-1; pos>=0; pos--)
    {
    if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
      {
      if(OrderSymbol()==Symbol() && OrderType()==type)
        {
        order++;             
        }
      }
    else
      Print("Ошибка ", GetLastError());
    }
  return(order);
    }



Скрипт:

#property show_inputs

extern double   Lots=1;

extern double   sl=0;
extern double   tp=0;
extern double   lev=100;
extern double   StopLoss=100;
extern double   TakeProfit=100;
extern int      HourOpen = 11;       
extern int      MinutesOpen = 59;
extern int      SecondsOpen = 10;
extern int      Slippage=3;
extern color    ArrowColor=CLR_NONE;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
    bool condition=true;
    double openprice;
    while(condition)
    {
    
        if(TimeHour(TimeCurrent())==HourOpen && TimeMinute(TimeCurrent())>=MinutesOpen && TimeSeconds(TimeCurrent())>=SecondsOpen)//и здесь тоже может не сработать
      {
        
        if(OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+lev*Point,3,(Ask+lev*Point)-StopLoss*Point,Ask+(TakeProfit+lev)*Point,NULL,0,0,ArrowColor)==-1)
        
        Print("Ордер не открыт, произошла ошибка №",GetLastError());
        condition=false;
      }
      Sleep(1000);
    }
 
//----
   return(0);
  }
Forex Trader
114255
Forex Trader 2007.08.16 15:14  
а проблема в чем?
Forex Trader
114255
Forex Trader 2007.08.16 16:09  
а проблема в чем?

Проблема в том, что эксперт не всегда открывает ордера. Т.е. не открывает когда нет цены в заданное для открытия время. Зацикленный скрипт должен выставлять ордера без пришедшего тика.
А самому мне очень долго разбираться надо, я не програмер
Forex Trader
114255
Forex Trader 2007.08.16 17:21  
запутал окончательно, если цены нет - то о каком ордере идет речь?
функция старт в эксперте без прихода тика работать не будет, если ордера выставляет зацикленный скрипт - то получается, что по твоему мнению не работает именно он, тогда уточни конкретно, в каком случае он должен это сделать, но не делает. хотя вижу что и в эксперте у тебя присутствуют строки по открытию ордеров
Forex Trader
114255
Forex Trader 2007.08.16 17:36  
запутал окончательно, если цены нет - то о каком ордере идет речь?
функция старт в эксперте без прихода тика работать не будет, если ордера выставляет зацикленный скрипт - то получается, что по твоему мнению не работает именно он, тогда уточни конкретно, в каком случае он должен это сделать, но не делает. хотя вижу что и в эксперте у тебя присутствуют строки по открытию ордеров

Цель: выставить ордера в пределах заданной минуты перед закрытием торгов, при условии что последний тик мог прийти 1-10 минут назад. Ведь вручную ордера ставятся, а эксперт ставит по приходу тика (функция start). Т.е получается что нужно взять цену с последнего тика и выставить ордера в заданное время.

Данный эксперт работает, но если тик не приходит в нужное время он ордер не выставит и торги закрываюся - все опоздали . Я про то, что некоторые питовые контракты открываются с большим разрывом и закрываем сразу в начале след. дня. Вручную торговать получается, но ручками медленнее ордера выставляются. Эксперт - быстро и удобно
Forex Trader
114255
Forex Trader 2007.08.16 17:39  
В принципе можно открывать ордера раньше на пару минут и ставить значительно дальше, а последнюю минуту модифицировать как можно ближе к текущей цене.
Если можете доработать код этого эксперта по такому условию, буду очень признателен.
Forex Trader
114255
Forex Trader 2007.08.16 19:09  
теперь более менее понятно, одна ошибочка
datetime TimeCurrent( )
Возвращает последнее известное время сервера (время прихода последней котировки) в виде количества секунд, прошедших после 00:00 1 января 1970 года.

т.е. тайм куррент не меняется до тех пор пока не будет тика, в данном случае наверно можно ориентироваться на локальное время datetime TimeLocal( )
Forex Trader
114255
Forex Trader 2007.08.16 21:06  
Как это описать в коде...
Forex Trader
114255
Forex Trader 2007.08.16 21:25  
Forex Trader
114255
Forex Trader 2007.08.16 21:37  
Нелегко...
Forex Trader
114255
Forex Trader 2007.08.16 22:16  
TimeCurrent( ) заменить на TimeLocal( ) ?
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий