Вопрос к знатокам

 

Плиз...не знаю как бы выразить - но лучше показать подскажите пожалуйста как сделать чтобы фракталы запоминались в памяти у советника и брался нужный из нескольких. Штатная функция

"iFractals(NULL, 0, MODE_UPPER, 3)" Отслеживает только фракталы на 3 свечи в прошлом и все - упуская при этом нужные фракталы.

Подобное действо можно к примеру разобрать на примере работы фрактала + алигатора: типо самый близкий фрактал на покупку и продажу запоминается, а потом совершается сделка на пробой... ну я думаю кто знаком с этим тот поймет мои корявые мысли.

 

"Штатная функция" iFractals допускает ее использование в цикле, примерно так:

for (int i=1; i<Bars; i++)
{
   if (iFractals(NULL, 0, MODE_UPPER,i) > 0) ...


}
 

как вариант

Создайте массив на нужное колличество баров и пишите туда значения фракталов. те у вас получается что что массив допустим на 300 значений вот и пишите значение фракталов на каждом баре в массив. большенство значений будут пустыми, а в некоторых будут значения фракталов. Когда массив заполнится используйте сдвигание всех значений на одно назад. я не думаю что вам нужно будет более 300 баров)


пример:

массив x[5] = {1, 2, 3, 4, 5}

Если некуда уже писать то сдвигаем все значения на 1 и получаем

массив x[5] = {2, 3, 4, 5, 6}

 
Figar0 писал(а) >>

"Штатная функция" iFractals допускает ее использование в цикле, примерно так:

так... спасибочки, но есть одно маленькое "НО" - как? )))

(все на том же банальном примере алигатора):

void posOpen()
{
int ticket;
if ( iFractals(NULL, 0, MODE_LOWER, 3) < iAlligator(NULL, 0, 13, 0, 8, 0, 5, 0, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, 1) && Low[0] < iFractals(NULL, 0, MODE_LOWER,3) && OrdersTotal()<=pos_num)
{
ticket=OrderSend(Symbol(),OP_SELL,LotSize(),Bid,10,0,0,"My",MAGIC,0,Green);
OrderSelect(ticket,SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+Loss*Point,OrderOpenPrice()-Profit*Point,0);
return;
}
if (iFractals(NULL, 0, MODE_UPPER, i)>iAlligator(NULL, 0, 13, 0, 8, 0, 5, 0, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, 1) && High[0]>iFractals(NULL, 0, MODE_UPPER, 3) && OrdersTotal()<=pos_num)
{
ticket=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,10,0,0,"My",MAGIC,0,Green);
OrderSelect(ticket,SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-Loss*Point,OrderOpenPrice()+Profit*Point,0);
return;
}

 

Шёл мимо. Заглянул.

Возможно пригодятся функции И.Кима для реализации идеи.

Функция FindNearFractal(). Стр.37
Эта функция выполняет поиск ближайшего фрактала и возвращает его ценовой уровень
ФУНКЦИЯ BarsBetweenLastFractals(string sy="", int tf=0)),
Расстояние между двумя соседними фракталами в барах
Функция GetFractallBar(). Стр.41
Возвращает номер бара вершины ближайшего фрактала
'Полезные функции от KimIV'
И стр. 43-44 по фракталам в той же ветке Игоря.

Кроме того, вот тут есть немного по фракталам - на 2 страничке -  'Вопрос к профессионалам '


 

Доброе утро.

Пожалуйста подскажите. По нескольким инструментам в мт4 работают советники.

По ценам открытия.

Входы во всех советниках выполнен вот так (чтобы советники не мешали др. другу):

if(Time[0] == prevtime)   return(0);//ждём появления нового бара
   prevtime = Time[0];//если появился новый бар , включаемся

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

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,SL,TP,"ттт_022",Magic,0,Red);
if(ticket < 0) {
   { Print("Ошибка открытия ордера SELL #", GetLastError()); return (0);} 
              Sleep(10000);// Вот здесь сбрасываем флаг сформировавшегося бара,
   // чтобы на следующем тике, а не на следующем баре,
   prevtime = Time[1];   }  // опять повторить операцию

Непонятно почему, но этот прием не работает!

При открытии нового бара обычно по 2-3 парам есть сигналы на открытие или закрытие, или модификацию и т.п.

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

Журнал ошибок при этом не пишет.

Хотя сигналы по др. парам есть со всей очевидностью!

Подскажите, в чем может быть проблема?

 
Проверяйте занятость торгового потока -
IsTradeAllowed( )
 
Rita писал(а) >>

Доброе утро.

Пожалуйста подскажите. По нескольким инструментам в мт4 работают советники.

По ценам открытия.

Входы во всех советниках выполнен вот так (чтобы советники не мешали др. другу):

Непонятно почему, но этот прием не работает!

При открытии нового бара обычно по 2-3 парам есть сигналы на открытие или закрытие, или модификацию и т.п.

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

Журнал ошибок при этом не пишет.

Хотя сигналы по др. парам есть со всей очевидностью!

Подскажите, в чем может быть проблема?

торговый поток занимается первым из советников, остальные не могут производить операции с ордерами, т.к. торговый поток занят.

Перед каждой операцией по модификации/открытии/закрытии ордера используйте конструкцию

while(IsTradeContextBusy()) {
  Sleep(500);
}

и проверяйте результаты выполнения операций, если неудача, то заход по-новой.

 

Благодарю, проверю. 

Но что это даст ? Да, -  Торговый поток занят, пока обрабатывается и исполняется сигнал по одной паре.

Но после исполнения этого сигнала торговый поток "по любому" освобождается и вот тут то и должно сработать условие 

 Sleep(10000);// Вот здесь сбрасываем флаг сформировавшегося бара,
   // чтобы на следующем тике, а не на следующем баре,
   prevtime = Time[1];   }  // опять повторить операцию

и на этом же баре должен отработать повторившийся сигнал  по другой паре!

Но этого не происходит. А советник ждет следующего бара.

 

Не вижу ошибки. Может она в другом куске кода.

 

Добрый вечер.

Вот у меня советник работает на конкурсном счете (и сервере).

На тф=н1.

Закралось подозрение, что сервер не реагирует на сигналы советника.

Ф-и открытия/закрытия позиций взял из "замонтированного" советника в мт4 Moving Average

//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
  if(iVolume("USDJPY_FX",60,0)>1) return;
//(с первым тиком нового бара начинаем работу)

   ma=iMA("USDJPY_FX",0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!="USDJPY_FX") continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
//----
  }

Я полагал, что такой алгоритм задает работу в режиме по ЦЕНАМ ОТКРЫТИЯ.

Однако. Вот уже не первый раз замечаю, - что позиция закрылась не в начале бара.

Вот например, сегодня позиция закрылась в 16:43  !!! При работе на тф=н1 !

Так подскажите! 

Всё-таки,  как работает такой код ?

По ценам открытия или нет ?

В любой мт4 можно глянуть советник Moving Average