техника мультивалютной торговли? - страница 3

 
HideYourRichess писал(а) >>

спасибо, буду разбиратьс

получите работающий вариант 'Код платформы многовалютного многотаймфреймового советника'

остается начинить вашими идеями :)

 
Mathemat писал(а) >>

А чему равна так называемая "периодичность появления тиков"? alexfx, ты представляешь, насколько аскетичным по вычислениям должен быть полный цикл обсчета, чтобы успевать до следующего тика - даже на очень быстром двухъядернике типа Intel Core 2 Duo Е8600?

задачка с "периодичностью" отпадает.

регистрирую тики на массиве инструментов 'Код платформы многовалютного многотаймфреймового советника' Правда дискрета - секунда. Хорошо это с тиками или нет не знаю.

Т.к. я с тиками не работал, подскажите, в каком диапазне частот они появляются (спокойный рынок, активный рынок)

 
HideYourRichess писал(а) >>

Гуд! а тиковых историй не будет. Будет простейшая эмуляция тиков на участке истории из минуток. После запуска советника эта имуляция просто будет сращиваться с реальным потоком тиков. Другими словами, на истории в каждой минутке будет от 1 до 4 тиков. Хотя, можно наверное на истории ограничиться HL/2 минуток, как один тик.

Ещё один способ, связанный с тиками, это так называемые эквиобъемные графики. Но могут быть и эквиобъемные тактики или стратегии. Понятно, что бывают пропуски в потоке тиков, но на проверку оказалось, что эти пропуски не так уж и существенны. Пример, в обычных стратегиях частенько момент окончания формирования бара, или начала формирования следующего бара, используются как момент принятия торгового решения. Известное эмпирическое правило, не торгуйте внутри бара (правило конечно спорное, в некоторых случаях). Но можно за момент принятия торгового решения взять приход, например, каждого двадцатого тика. Ну и т.д.

Для меня это пока, как в анекдоте про капитанов подводных лодок ("ты не умничай - пальцем покажи") :)))

 
HideYourRichess >>:

Интересный вопрос оказался. Как наиболее грамотно организовать советник или советники, что бы была мультивалютная торговля.


Пример мультивалютки








эксперт висит на нескольких парах

это полуавтомат


главная его задача это вход вывод в безубыток и расчет целей

вход на пробое и после пробоя

цели считаю по фибо

выход порой делаю руками

обычно в районе америки некоторым ордерам даю идти в профит во второй день

---


Вариант 2.

как вариант удобен


Вариант 3.

тики можно отслеживать

MarketInfo ( StringSymbol, MODE_ASK );

MarketInfo ( StringSymbol, MODE_BID );


я бы выбрал под мультивалютку 2-й или 3-й вариант


1-й это просто независимые советники и только разрулить проблему с потоком

т е поток бывает занят и если два или более эксперта вдруг начнут двать команды одновремнно будут проблемы

с обработкой

 
alexfx >>:

Для меня это пока, как в анекдоте про капитанов подводных лодок ("ты не умничай - пальцем покажи") :)))

Пока тыкать не в чего. Но как только будет чего интересное - обязательно покажу.

 
HideYourRichess писал(а) >>

Пока тыкать не в чего. Но как только будет чего интересное - обязательно покажу.

Вот, например, я добавил в него возможность считать количество тиков по каждому инструменту за определенный промежуток времени (в данном случае 10 сек).

Я думаю, если на всех инструментах количество тиков растет, то время торговать :)

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

//+------------------------------------------------------------------+
//|                                               MultiSymbolТic.mq4 |
//|                                                 Copyright © 2009 |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
//
int TimeCycle  = 60;   //=== допустимое время обработки цикла в сек.
int TimeCycle2 = 5;    //=== время обработки цикла в сек, превышение которого должно сообщаться.
int countSymbol;       //=== количество торгуемых инструментов (массив Symbol_array[])
//
string Symbol_array[] = {"EURUSD","GBPUSD","AUDUSD","USDJPY","USDCHF","USDCAD","EURJPY","EURGBP","EURCHF"};
datetime ТicTime[9];   //=== время поступления последней котировки для регистрации тиков 
int countТic[9];       //=== количество тиков по инструменту на заданном периоде времени
int ТicPeriod = 10;    //=== период времени (в сек) замера количества тиков
int countPeriod1;      //=== для замера периода времени
int countPeriod2;      //=== для замера периода времени

//
int init()   { return(0); }
int deinit() { return(0); }
//
//===== зацикленная функция start() ======================================================================================
int start()             {  
   startustanovki();         // начальные установки
   while(!IsStopped())  {    // До тех пор, пока пользователь не прекратит исполнение программы 
   
      if (kontrol()==0)   break;   //=== контрольные функции     
      int TC1   = TimeCurrent();   //=== время начала обработки цикла
      RefreshRates();              //=== Обновление данных                   
      SymbolТic();                 //=== регистрация появления нового тика на любом инструменте
      
      //====================== ежечасный профилактический перезапуск цикла ========  
      string text   = TimeToStr(TimeCurrent(),TIME_MINUTES);            
      int    index = StringFind(text, ":49", 0);   // разрешение на очередной ежечастный однократный перезапуск эксперта (цикла)
      if     (index==2) {bool perezapusk=true;}       
      index = StringFind(text, ":50", 0);          // профилактический перезапуск цикла делаю за 10 минут до начала нового часа 
      if     ((index==2)&&(perezapusk==true)){
         Print("======================================================");
         Print(" Профилактический, перезапуск цикла обработки ",TimeToStr(TimeCurrent(),TIME_MINUTES));
         Print("======================================================");   perezapusk=false;  break;
      }   
      //====================== ежечасный профилактический перезапуск цикла ========  
      
      Sleep(1000);                  // притормози! (замедлитель цикла обработки)  
      
      int TC2 = TimeCurrent();     //=== время окончания обработки цикла               
      int analiz = TC2-TC1;  
      if (analiz>TimeCycle)   {
         Print("=================================================================");
         Print("Превышение допустимого (",TimeCycle,"сек) времени обработки !!!  ",analiz,"сек       Перезапуск цикла обработки.");
         Print("=================================================================");
         break;
      }   
   }      
   return(0);                      // Управление возвращается терминалу
}
//===== зацикленная функция start() ======================================================================================
//
//===== начальные установки ==============================================================================================   
void startustanovki()   {
   countPeriod1 = TimeCurrent();
   countSymbol  = ArraySize(Symbol_array);
   for(int i=0; i<countSymbol; i++)  {      //=== перебор инструментов
      ТicTime[i] = 0;
      countТic[i] = 0;
   }          
}
//===== начальные установки ==============================================================================================   
//
//===== периодический контроль ===========================================================================================   
int kontrol()     {
   if(!IsConnected())       { Print("----- Связь отсутствует!------------------------------------------------------------------"); return(0); }
   if(!IsExpertEnabled())   { Print("----- В клиентском терминале запуск экспертов запрещен! ----------------------------------"); return(0); }
   if(!IsTradeAllowed())    { Print("----- Поток для выполнения торговых операций занят! Эксперту не разрешено торговать! -----"); return(0); }
   if(IsTradeContextBusy()) { Print("----- Торговый поток занят. Подождите ----------------------------------------------------"); return(0); }
   return(1);
}
//===== периодический контроль ===========================================================================================   
//
 
//===== регистрация появления нового тика на любом инструменте ===========================================================
void SymbolТic()  {
   bool TT      = false;                //=== флаг необходимости замера времени последующей обработки
   bool NewТicS = false;                //=== флаг появления тика
   int  TC1     = TimeCurrent();        //=== время начала обработки 
   
   for(int i=0; i<countSymbol; i++)  {  //=== перебор инструментов
      if (isNewТic(i))  {               //=== появился новый тик по текущему инструменту
         TT      = true;                 
         NewТicS = true;
         ТicSymbol(i);                  //=== процедура, которую целесообразно запускать при появлении каждого тика
      }                                 //=== на любом из инструментов
   } 
   if (NewТicS==true)  { 
      ТicSymbolS();                     //=== процедура, которую целесообразно запускать после окончания сканирования всех инструментов
   }                                    //=== при условии, что за время сканирования появился хотя-бы один тик 
    
   int TC2 = TimeCurrent();                     
   int analiz = TC2-TC1;                //=== замер времени обработки
   if ((TT==true)&&(analiz>TimeCycle2)) {   
      Print("            Время обработки  ",analiz,"сек.");
   }
}      
//===== регистрация появления нового тика на любом инструменте ===========================================================
//
//===== возвращает true если появлися новый тик, иначе false =============================================================  
bool isNewТic(int i)  {           //=== i-индекс инструмента
   bool res=false;  
   RefreshRates();
   datetime TT = MarketInfo(Symbol_array[i],MODE_TIME); 
   if ( ТicTime[i] != TT )   { ТicTime[i] = TT ;  res=true; } 
   return(res);
}
//===== возвращает true если появлися новый тик, иначе false =============================================================  
//
void ТicSymbol(int i)      {  
   double ask   =MarketInfo(Symbol_array[i],MODE_ASK);
   Print("     ",Symbol_array[i],"     ТicTime=",ТicTime[i],"     ask=",ask);      
   countТic[i]++;         
}
//

void ТicSymbolS() {
   int countPeriod2 = TimeCurrent();
   if  ((countPeriod2 - countPeriod1)>ТicPeriod)  {
      countPeriod1 = countPeriod2;
      for(int i=0; i<countSymbol; i++)  {  
         Print("                         ",Symbol_array[i],"     countТic=",countТic[i]);      
         countТic[i] = 0;      
      }   
   }  
}
Причина обращения: