Вопрос по мультивалютному советнику - страница 4

 

Ок, VassaV, уяснил !

Вот тут ещё вопрос встал. В обычном коде при открытии позиции значится:

//---------проверяем условие на покупку----------------------------
  if   ( бла-бла-бла  )
   {
  Lots=GetSizeLot(); 
  ticket=OrderSend("GBPUSD",0,Lots,Ask,Slippage,Bid-SL_long*Point,Ask+TP_long*Point,
                                                         "мульти",MagicNum,0,CLR_NONE);
  if    (ticket<0) { Print("Ошибка открытия ордера BUY #", GetLastError()); return (0); }  
 ... ... ...

Здесь есть значение "ticket" . У меня же в мультисоветнике схемка несколько иная - вот такая:

if (GBP) {     //если  "выключатель" включен
if (!ExpertOrder(MagicGBP)) { //если ордеров по паре GBPUSD нет
 
//-------Проверяем условие на покупку-------------
if  (    бла-бла-бла     )
    {  
  //---- Цикл открытия ордера  -------------------------------------------                      
int Cnt=1;
  while (Cnt <= 5) 
  { //-----покупаем--------------
    Lots=GetSizeLot();
   if (OrderSend("GBPUSD",OP_BUY,Lots,ask_GBP,3,bid_GBP - sl_GBPUSD_long*point_GBP,
           ask_GBP+tp_GBPUSD_long*point_GBP,"M_1", MagicGBP, 0, Blue) > 0)  break;    
    else 
{ Print ("Ошибка открытия Buy #", ErrorDescription( GetLastError() ),
                                                  " попытка ", Cnt);
                               
        if (Cnt==5) return(0);  //если за 5 попыток не закрыли - выходим
        Cnt++;
        Sleep(15000); // ждём 15 секунд
      }   
    }
  }

Но мне при этом тоже нужно поиметь значение "ticket" ! Для этой пары. Никак не могу - всё утро сделать это! Кто знает, - Пож. подскажите - как?

 

Всем, кто хотел подсказать, но не успел ответить - спасибо!

Вроде бы сам сообразил (после обеда). Сделал так:

 //---- Цикл открытия ордера  -------------------------------------------                      
int Cnt=1;
  while (Cnt <= 5) 
  { //-----покупаем--------------
    Lots=GetSizeLot();
   ticketGBP = OrderSend("GBPUSD",OP_BUY,Lots,ask_GBP,3,bid_GBP - sl_GBPUSD_long*point_GBP,
           ask_GBP+tp_GBPUSD_long*point_GBP,"M_1", MagicGBP, 0, Blue);
         if (ticketGBP > 0)  break;    
    else 
{ Print ("Ошибка открытия Buy #", ErrorDescription( GetLastError() ),
                                                  " попытка ", Cnt);
                               
        if (Cnt==5) return(0);  //если за 5 попыток не закрыли - выходим
        Cnt++;
        Sleep(15000); // ждём 15 секунд
      }
 

Условие 5-минутного тестирования советника на чемпионате, да ещё всего лишь за 3 недели до конца срока, оказалось для всех почти УДАРОМ НИЖЕ ПОЯСА !

по отдельности мой эксперт тестируется на истории 12 месяцев по одной паре, - не более 3-4 минут. Работает по всем тикам.

Но когда я обьединяю несколько экспертов в один - мультиавалютный, то время тестирования увеличивается до 7-10 мин !

Причем в свойствах я отключаю все пары кроме одной, - кот. прогоняю.

Просьба к специалистам (и не только) - пож. поделитесь приемами и способами, чтобы уменьшить время тестирования.

Структура эксперта вот такая:

 
//---- input parameters---------
 
ЗАДАЕМ ВНЕШНИЕ ПАРАМЕТРЫ ПО КАЖДОЙ ПАРЕ
 
int init()
  {
   return(0);
  }
int deinit()
  {
   return(0);
  }
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  { 
 
//*********************************************************************
 
double ЗАДАЕМ ПЕРЕМЕННЫЕ ПО ПЕРВОЙ ПАРЕ 
double ЗАДАЕМ ПЕРЕМЕННЫЕ ПО ВТОРОЙ ПАРЕ
... ... ... ...
double ЗАДАЕМ ПЕРЕМЕННЫЕ ПО ПОСЛЕДНЕЙ ПАРЕ
 
 =========================================================
 
int Orders=OrdersTotal ();     //получаем кол-во открытых ордеров
if (Orders<3)                 //если  открытых ордеров <3
  { 
if (выключатель 1 вкл) {ОТКРЫВАЕМ ПЕРВУЮ ПАРУ } 
if (выключатель 2 вкл) {ОТКРЫВАЕМ ВТОРУЮ ПАРУ } 
... ... ... 
if (выключатель N вкл) {ОТКРЫВАЕМ ПОСЛЕДНЮЮ ПАРУ }  
  }
//========================================================================
for (int x=0; x<OrdersTotal(); x++)                                             {
    if (OrderSelect(x, SELECT_BY_POS, MODE_TRADES)) 
{       
if (UseTrailing 1) - ТРЕЙЛИНГ ПЕРВОЙ ПАРЫ
... ... ...
if (UseTrailing N) - Трейлинг последней пары
}
//======================================================================
   return(0);
  }
 
rid:

Условие 5-минутного тестирования советника на чемпионате да ещё всего лишь за 3 недели до конца срока оказалось для всех почти УДАРОМ НИЖЕ ПОЯСА !

по отдельности мой эксперт тестируется на истории 12 месяцев по одной паре - не более 3-4 минут. Работает по всем тикам.

Но когда я обьединяю несколько экспертов в один - мультиавалютный то время тестирования увеличивается до 7-10 мин !

Причем в свойствах я отключаю все пары кроме одной - кот. прогоняю.

Просьба к специалистам (и не только) - пож. поделитесь приемами и способами чтобы уменьшить время тестирования.

Структура эксперта вот такая:

 
//---- input parameters---------
 
ЗАДАЕМ ВНЕШНИЕ ПАРАМЕТРЫ ПО КАЖДОЙ ПАРЕ
 
int init()
  {
   return(0);
  }
int deinit()
  {
   return(0);
  }
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  { 
 
//*********************************************************************
 
double ЗАДАЕМ ПЕРЕМЕННЫЕ ПО ПЕРВОЙ ПАРЕ 
double ЗАДАЕМ ПЕРЕМЕННЫЕ ПО ВТОРОЙ ПАРЕ
... ... ... ...
double ЗАДАЕМ ПЕРЕМЕННЫЕ ПО ПОСЛЕДНЕЙ ПАРЕ
 
 =========================================================
 
int Orders=OrdersTotal ();     //получаем кол-во открытых ордеров
if (Orders<3)                 //если  открытых ордеров <3
  { 
if (выключатель 1 вкл) {ОТКРЫВАЕМ ПЕРВУЮ ПАРУ } 
if (выключатель 2 вкл) {ОТКРЫВАЕМ ВТОРУЮ ПАРУ } 
... ... ... 
if (выключатель N вкл) {ОТКРЫВАЕМ ПОСЛЕДНЮЮ ПАРУ }  
  }
//========================================================================
for (int x=0; x<OrdersTotal(); x++)                                             {
    if (OrderSelect(x, SELECT_BY_POS, MODE_TRADES)) 
{       
if (UseTrailing 1) - ТРЕЙЛИНГ ПЕРВОЙ ПАРЫ
... ... ...
if (UseTrailing N) - Трейлинг последней пары
}
//======================================================================
   return(0);
  }

медленно теститруется в основном из за индикаторов

в этой структуре их не видно, но они есть у вас скорее всего, иначе бы вложились максимум в минуту при тестировании.

индикаторы надо измеменять или переносить в код в советник.

 

Loky,

Я вас правильно понял?

Индикаторы у меня там, где я задаю переменные. И видимо их

double ЗАДАЕМ ПЕРЕМЕННЫЕ (индикаторов) ПО ПЕРВОЙ ПАРЕ

нужно видимо перенести внутрь в

if (выключатель 1 вкл) {ОТКРЫВАЕМ ПЕРВУЮ ПАРУ }

для каждой пары соответственно?

 
Посмотрите как пример такой - Prototype-IX. Пример мультивалютного советника

Он позволяет провести тестирование на любой из 12 валютных пар, и на нескольких тайм-фреймах.
15:18:05 ProtoType-IX inputs: EMN=10000; Slippage=3; RiskDelta=5; PeriodWPR=8; CriteriaWPR=25; ATRPeriod=40; kATR=0.5; ZeroBar=8; MinTargetinSpread=5; TP_SL_Criteria=2; MaxOpenedOrders=3; MaxOrderSize=5;
15:18:05 2006.10.17 09:38 ProtoType-IX EURUSD,M15: indexPeriod=2 PeriodTesting=15 Symbol index=3 SymbolTesting=EURUSD
15:18:05 2006.10.17 09:38 NRTR_GATOR EURUSD,M15: loaded successfully
15:18:09 2006.10.17 09:38 NRTR_GATOR EURUSD,M30: loaded successfully
15:18:09 2006.10.17 09:38 NRTR_GATOR EURUSD,H1: loaded successfully
15:18:09 2006.10.17 09:38 NRTR_GATOR EURUSD,H4: loaded successfully
15:18:09 2006.10.17 09:38 NRTR_GATOR EURUSD,Daily: loaded successfully
15:18:09 2007.01.02 00:00 NRTR_GATOR EURUSD,M30: Внимание! Тренд не определен, такого быть не может. Бар от конца 4
15:18:09 2007.01.02 00:00 NRTR_GATOR EURUSD,M30: Внимание! Тренд не определен, такого быть не может
15:18:09 2007.01.02 00:00 NRTR_GATOR EURUSD,H1: Внимание! Тренд не определен, такого быть не может. Бар от конца 1
15:18:09 2007.01.02 00:00 NRTR_GATOR EURUSD,H1: Внимание! Тренд не определен, такого быть не может
......................................

15:18:23 2007.08.17 22:17 Tester: stop loss #242 at 1.3483 (1.3483 / 1.3485)
15:18:23 2007.08.17 22:59 NRTR_GATOR EURUSD,Daily: removed
15:18:23 2007.08.17 22:59 NRTR_GATOR EURUSD,H4: removed
15:18:23 2007.08.17 22:59 NRTR_GATOR EURUSD,H1: removed
15:18:23 2007.08.17 22:59 NRTR_GATOR EURUSD,M30: removed
15:18:23 2007.08.17 22:59 ProtoType-IX EURUSD,M15: Тестирование завершено


Тестировани на 15 минутках в модели "Every ticks" заняло 18 секунд.
 

Спасибо, тем кто откликнулся на вопрос. Проясняется дело постепенно. Запрятал индюки внутрь. И теперь лимит соответствует.

Rosh, - с дюжину раз уже пытался подступиться к названному вами эксперту. Но..., всякий раз отступал... С моими скромными знаниями пока не удается вникнуть в код и в его структуру. И глаза разбегаются, и не совсем понятно, с чего начинать и как выстраивать его исследование. Много неясностей, а до всего сразу руки не доходят. Начинаю разбираться и скоро перестаю соображать, - а с чего начал и для чего ...

А вот пользуясь случаем есть вопрос по статье " Пример создания эксперта" ^

 
klerk:
принцип мултивалютного эксперта примерно следующий:
1. в расчете индикаторов указывать конкретные валюты и временные интервалы, например: iRSI("GBPUSD",60,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,i); //кстати вот и ошибка
2. получать с помощью MarketInfo цены, пункты и т.д.
3. вместо например Low[0] использовать iLow(...)
и пиши, хоть на все валютные пары.
Удачи.
Единственное неудобство - должны быть открыты графики всех торгуемых инструментов с используемыми таймфреймами.

Если графики не открыты, или открыты с тайфреймами, отличными от используемых, необходимо постоянно производить

проверки по каждому чиху - даже iRSI может не выполниться..., до тех пор пока терминал не произведет подкачку ...

С уважением - С.Д.
 

В онлайне я задаю в советнике (в индюках) тф=1 мин (для проверки работоспособ.) по всем парам.

И ставлю на график первой пары на тф=1мин. Но на др. парах советника графики у меня зачастую стоят др. тф. И тем не менее советник работает по всем парам именно по тф-минуткам, как и заложено в коде!

Или я не совсем вас понял?

 
klerk:
принцип мултивалютного эксперта примерно следующий:
1. в расчете индикаторов указывать конкретные валюты и временные интервалы, например: iRSI("GBPUSD",60,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,i); //кстати вот и ошибка
2. получать с помощью MarketInfo цены, пункты и т.д.
3. вместо например Low[0] использовать iLow(...)
и пиши, хоть на все валютные пары.
Удачи.


Подскажите плз корректна ли будет замена конструкции вида:

H=High[iHighest("USDJPY", PERIOD_H4, MODE_HIGH, 50, 1)];

в коде мультивалютного эксперта при работе по чужому инструменту на такую:

double H_current, H_previous;
H_current=0; H_previous=0;
 
for (int n=1; n<51; n++)
  {
    H_previous=H_current;
    H_current=iHigh("USDJPY", PERIOD_H4, n);
    H=MathMax(H_previous, H_current);
  }

Если нет, подскажите плз в чём ошибка и как правильно сделать?

Заранее спасибо.

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