[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 131

 

 Я тут переделал кусок кода, по поводу того, что спрашивал вчера. Теперь всё как нужно. Ниже привожу 3 функции, что б было видно, что используется для получения первоначального сигнала, т.к. это только начала того, что я пишу.

 

//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   
   DeletePendingOrders();
   
   if (signal == SIGNAL_BUY)
       if (!OpenBuy(fastMa, slowMa))
          return(false);
   
   if (signal == SIGNAL_SELL)
       if (!OpenSell(fastMa, slowMa))
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
       if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

 Вот функция покупки:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
//   if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )
   {
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
   }
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

 Вот здесь есть строка:

ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);

 открытие позиции у нас по цене ND(fastMa + i_thresholdFromMa * pt), а открывает вообще не там. Почему?

Уже 2 дня бью, не знаю уже что и делать. В коде всё последовательно же. Для реала не писал никакие проверки, пока что для тестера пишу.

 Вот скрин, например,

Косяк 

 

 На графике видно, что цена не выше fastMa (красной машки), а ниже вообще. Но в коде, явно указано условие, чтоб отложка была по цене:

 

ND(fastMa + i_thresholdFromMa * pt)

В чём подвох профессионалы? Я уже не знаю что и делать дальше...

 

Здравствуйте.Написал индикатор от индикатора.Изначальный индикатор "Signal-Signal" при установке его на график показывает свои значения на всех предыдущих барах (он считается на всех барах,начиная бара №[1] ).А вот индикатор,построенный от него (этот индикатор считается с бара №[0] ), показывает свои значения только с момента установки его на график.Значения правильные, но на предыдущих барах -"пусто".Подскажите, пожалуйста, как это исправить.Много чего пробовал,но ничего не получается.

Мой код:

#property indicator_separate_window
#property indicator_minimum -7
#property indicator_maximum 7
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 DarkOrange
#property indicator_width1  2
#property indicator_width2  2
#property indicator_level1 0.0
//--- buffers
double UpMapBuffer[];
double DnMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,UpMapBuffer);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,DnMapBuffer);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int vb;   // внутренний бар
    int i;

    for(i=1;i<Bars-34-1;i++)                                               
     {
      double AO_Sig_Sig_1 = iCustom(NULL,0,"Signal-Signal",0,i);                           
      double AO_Sig_Sig_2 = iCustom(NULL,0,"Signal-Signal",0,i+1);
      
      if((High[i]<=High[i+1])&&(Low[i]>=Low[i+1])&&(AO_Sig_Sig_1==AO_Sig_Sig_2))  vb++;
            
      if((AO_Sig_Sig_1!=AO_Sig_Sig_2)||(i>3+vb)) break;                                                                
     }
         
    i=i*(AO_Sig_Sig_1); 
            
    if(MathAbs(i)>3+vb) i=0;                  

    if(i>0)            
     {
      UpMapBuffer[0]=i;
     }
    else
     {
      UpMapBuffer[0]=0;
     } 
         
    if(i<0)         
     {
      DnMapBuffer[0]=i;
     }
    else
     {
      DnMapBuffer[0]=0;
     }          
                      
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Виктор, думаю, что надо ставить отложку по Аску + дистанция, а в условии прописать отношение Аска и Машки, тогда будет то, что Вы хотите. Пробуйте!

 
hoz:

 


 На графике видно, что цена не выше fastMa (красной машки), а ниже вообще. Но в коде, явно указано условие, чтоб отложка была по цене:

 

В чём подвох профессионалы? Я уже не знаю что и делать дальше...

Возможно в тот момент времени, когда выставлялся ордер, МАшка была ниже, чем сейчас нарисовано. Попробуйте брать значения машек не с 0-го, а с 1-ого бара.
 
borilunad:

Виктор, думаю, что надо ставить отложку по Аску + дистанция, а в условии прописать отношение Аска и Машки, тогда будет то, что Вы хотите. Пробуйте!


Борис, Вот я так и сделал:

//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
      // if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
       if ( (MathAbs(Ask - fastMa) <= 0.1 * pt ) || ( MathAbs(Ask - fastMa) <= 0.1 * pt) )
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

 А вот открытие позиции:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
      
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

  Вроде всё верно. Но воз и ныне там.

 

Sepulca:
Возможно в тот момент времени, когда выставлялся ордер, МАшка была ниже, чем сейчас нарисовано. Попробуйте брать значения машек не с 0-го, а с 1-ого бара.


  пробывал, разницы нету. Вернул назад.. Для меня важно то, что происходит в данный момент времени, а не происходило раньше.

Вот скрин (если значение получаемое от машки не 0, а 1) :

 Где логика?

 

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

 
hoz:


Борис, Вот я так и сделал:

 А вот открытие позиции:

  Вроде всё верно. Но воз и ныне там.

 


  пробывал, разницы нету. Вернул назад.. Для меня важно то, что происходит в данный момент времени, а не происходило раньше.

Вот скрин (если значение получаемое от машки не 0, а 1) :

 

Ну наконец уже скажите, что именно хотите сделать... Например: МАшка такая-то движется вверх и она выше МАшки такой-то, при этом цена там-то , ниже/выше МАшки такой-то и если всё это true, то выставить такую-то отложку на таком-то расстоянии. Я вам подскажу примерный алгоритм. А то из кусочков вашего кода, вырванных из контекста, сложно вас направить в нужном направлении. А ведь задачка-то для пятого класса (утрированно)


По поводу выделенного: работайте по ценам открытия, тогда не будет перерисовки МАшек на нулевом баре

 
artmedia70:

... сложно вас направить в нужном направлении...

ИМХО, не сложно, но очень просто "направить" или отправить, ибо товарисч уж слишком рьяно взялся за борьбу с машками и отложками, толком не потрудившись изучить учебник и документацию. :-)

 
Roman.:

ИМХО, не сложно, но очень просто "направить" или отправить, ибо товарисч уж слишком рьяно взялся за борьбу с машками и отложками, толком не потрудившись изучить учебник и документацию. :-)

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

    

 

 


Большое спасибо. именно то, что необходимо)
Причина обращения: