Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 823

 
User_mt5:

Я тоже так предполагаю. Но дальше-то что? Ни удалить ни модифицировать ордер не получается. И что, они будут висеть пожизненно?
И не очень понятно что значит недостаточно лотов на демо .

Нет, это неверно. Выставить ордер можно где угодно в пределах текущих ограничений. Есть ограничение StopLevel. Т.е. выставить ордер получится не ближе к цене, чем значение StopLevel.

Но если сервер принял, значит всё в порядке.


там на бирже немного по другому... 

 
Vladislav Andruschenko:

там на бирже немного по другому... 

Влад, на какой бирже??? Видно-же демка какой конторы открыта...

 
Alexey Viktorov:

Влад, на какой бирже??? Видно-же демка какой конторы открыта...


я имел ввиду на фьючерсах. хотя нет, что-то я запутался. не обращайте внимания. я сейчас под таблетками. 

 
Alexey Viktorov:

Влад, на какой бирже??? Видно-же демка какой конторы открыта...

Не могли бы Вы пояснить содержание этого комментария?  А то я новичок в этом деле.
Кстати, ткнул в кнопку Buy, ордер не исполнился, но отображается как.. как бы отложенный в окне Инструменты, а в чарте - нет.
 
User_mt5:
Не могли бы Вы пояснить содержание этого комментария?  А то я новичок в этом деле.
Кстати, ткнул в кнопку Buy, ордер не исполнился, но отображается как.. как бы отложенный в окне Инструменты, а в чарте - нет.
А что пояснять? На скрине видно номер счёта и имя брокера который никакого отношения к бирже не имеет.
 
Alexey Viktorov:
А что пояснять? На скрине видно номер счёта и имя брокера который никакого отношения к бирже не имеет.

Я не понимаю..

Если этот брокер не даст мне торговать по этому символу, то накой он включил его в список символов на демке?
А если даст, то как понимать текущее положение дел с ордерами?

И вообще, вот если ордер исполнился частично (на 5-ке такое возможно), то какова судьба оставшегося ордера?
Он должен быть закрыт или жить до ручного закрытия или до исполнения?
Если это где-то написано, был бы крайне признателен за ссылку.

 
User_mt5:

Я не понимаю..

Если этот брокер не даст мне торговать по этому символу, то накой он включил его в список символов на демке?
А если даст, то как понимать текущее положение дел с ордерами?

И вообще, вот если ордер исполнился частично (на 5-ке такое возможно), то какова судьба оставшегося ордера?
Он должен быть закрыт или жить до ручного закрытия или до исполнения?
Если это где-то написано, был бы крайне признателен за ссылку.

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

 
Vladimir Karputov:

Примерный алгоритм:

  1. Создаём в OnInit() два хендла (для быстрого и медленного индикатора Moving Average)
  2. В OnTick() (работать рекомендуется только на новом баре, а не на каждом тике) объявляем два массива - в одном будут потом скопированы значения с быстрого MA, а во второй массив будут скопированы данные с медленного MA.
  3. Копируем например 100 последних значений (то есть копировать нужно с индекса "0" и количество "100") с медленно MA и быстрого MA в эти массивы. 
  4. Переворачиваем массивы так, чтобы индекс #0 в массивах соответствовал самому правому бару на графике.
  5. Теперь остаётся в цикле от "0" до "100-1" пройтись по обоим массивам и искать пересечение. Когда найдём пересечение, то значение переменной цикла как раз и будет номером бара.
Примечание: в этом алгоритме не учтены никакие проверки и защиты от ошибок.

Спасибо, как написать цикл поиска номера бара пересечения двух МА когда первые два пункта алгоритма выполнены и есть значения двух МА на первом баре?

   MA1_1=iMAGet(handle_iMA_1, 1);      // значение 1-й МА

   MA2_1=iMAGet(handle_iMA_2, 1);      // значение 2-й МА

/

double iMAGet(const int handle,const int index)
  {
   double MA[];
   ArraySetAsSeries(MA,true);
//--- reset error code 
   ResetLastError();
//--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 index 
   if(CopyBuffer(handle,0,0,index+1,MA)<0)
     {
      //--- if the copying fails, tell the error code 
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated 
      return(0.0);
     }
   return(MA[index]);
  }

.

 
lil_lil:

Спасибо, как написать цикл поиска номера бара пересечения двух МА когда первые два пункта алгоритма выполнены и есть значения двух МА на первом баре?

/

.


Ага, Вы решили всё таки не через массивы.

Примечание: решение через массивы (копирование в массивы First[], Second[] и Third[] ПОСЛЕДНИХ ТРЁХ значений с индикаторов) - Crossing of two iMA - OnTick():

//--- We look for crossing of two indicators
   double   First[];
   double   Second[];
   double   Third[];
   ArraySetAsSeries(First,true);    // index [0] - the most right bar on a charts
   ArraySetAsSeries(Second,true);   // index [0] - the most right bar on a charts
   ArraySetAsSeries(Third,true);    // index [0] - the most right bar on a charts
   int      buffer_num=0;           // indicator buffer number 
   int      start_pos=0;            // start position 
   int      count=3;                // amount to copy 
   if(!iMAGet(handle_iMA_First,buffer_num,start_pos,count,First))
      return;
   if(!iMAGet(handle_iMA_Second,buffer_num,start_pos,count,Second))
      return;
   if(InpFilterMA)
      if(!iMAGet(handle_iMA_Third,buffer_num,start_pos,count,Third))
         return;
//--- step 1: check in the arrays bars [0] and [1]
   if(First[0]>Second[0] && First[1]<Second[1]) // buy
     {
      if(InpFilterMA)
         if(Third[0]>=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[0] && First[1]>Second[1]) // sell
     {
      if(InpFilterMA)
         if(Third[0]<=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }
//--- step 2: on a step of 1 crossing haven't found. check in the arrays bars [0] and [2]
   if(First[0]>Second[0] && First[2]<Second[2]) // buy
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[2] && First[1]>Second[2]) // sell
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }


В Вашем случае (получение по одному значению) цикл будет выглядеть примерно так:

   int      signal=0;                                 // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
   double   MA1_curr=iMAGet(handle_iMA_1,0);          // the value of the 1st MA on i bar
   double   MA2_curr=iMAGet(handle_iMA_2,0);          // the value of the 1st MA on i bar
   for(int i=0;i<100;i++)
     {
      double   MA1_prev=iMAGet(handle_iMA_1,i+1);     // the value of the 1st MA on i+1 th bar
      double   MA2_prev=iMAGet(handle_iMA_2,i+1);     // the value of the 1st MA on i+1 th bar
      //---
      signal=0;                                       // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
      if(MA1_prev<MA2_prev && MA1_curr>MA2_curr)
         signal=1;
      else if(MA1_prev>MA2_prev && MA1_curr<MA2_curr)
         signal=-1;
      //---
      MA1_curr=MA1_prev;
      MA2_curr=MA2_prev;
     }

MA1_curr - значение индикатора MA1 на баре #i, MA1_prev - значение индикатора MA1 на баре #i+1
MA2_curr - значение индикатора MA2 на баре #i, MA2_prev - значение индикатора MA2 на баре #i+1

Когда получаете пересечение (переменная signal равна или "-1" или "1") - значение i и будет номером бара на котором произошло пересечение.

Это самый простой алгоритм поиска пересечения, но не самый точный.

 
Vladimir Karputov:

Ага, Вы решили всё таки не через массивы...


Спасибо, в качестве примера был взят другой ваш советник MA Cross

В нём и хочу сделать вход на третьем или на пятом или...n баре после пересечения

Vladimir Karputov:

В Вашем случае (получение по одному значению) цикл будет выглядеть примерно так:

Почему нет выхода из цикла, когда пересечение найдено?

Эти условия можно поставить за пределами цикла?

 if(signal==-1)num_bar_b=i;
 if(signal==1)num_bar_s=i;

.