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

 

Подскажите пожалуйста, что не правильно в коде.


Код:

//+------------------------------------------------------------------+
//|                                                    SMI Trade.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_level1 0
 
extern int Q=14;
extern int R=10;
extern int S=14;
 
double SMI_Trade[];
double Value1[];
double Value2[];
double Value3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,SMI_Trade);
   SetIndexBuffer(1,Value1);
   SetIndexBuffer(2,Value2);
   SetIndexBuffer(3,Value3);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
 
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars;
   int limit;
   int i;
   
   if(counted_bars<0) return(-1);
   
   limit=Bars-Q-R-S-counted_bars;
   
   for (i=limit;i>=0;i--)
   {
   Value1[i]=iCustom(NULL,0,"SMI",Q,R,S,0,0,0,i);
   }
   
   if(Value1[i]-Value1[i-1]>0&&Value1[i]>0)
   Value2[i]=Value1[i];
   else
   Value2[i]=0;
   
   if(Value1[i]-Value1[i-1]<0&&Value1[i]<0)
   Value3[i]=Value1[i];
   else
   Value3[i]=0;
   
   for (i=limit;i>=0;i--)
   SMI_Trade[i]=Value2[i]+Value3[i];
      
   return(0);
  }
//+------------------------------------------------------------------+

Результат:

Файлы:
smi_1.mq4  4 kb
 

Скобки первого цикла for пожалуй стоит распространить на последующие операторы условий, если по логике, впрочем особо в суть не вникал.

З.Ы. Впрочем я поторопился, у Вас там и вовсе бред, надо подучить матчасть.. Где присваивается значение переменной counted_bars?

 
Совет: чтобы освоить программирование обязательно рисовать блок-схемы.
 
Figar0:

Скобки первого цикла for пожалуй стоит распространить на последующие операторы условий, если по логике, впрочем особо в суть не вникал.

З.Ы. Впрочем я поторопился, у Вас там и вовсе бред, надо подучить матчасть.. Где присваивается значение переменной counted_bars?

Да, присваения значения переменной counted_bars нет. Присвоив его, лучшего результата я не достиг. Это, на сколько я понимаю, одна из частей оптимизации расчёта.


З.Ы.

Допускаю, что

   if(Value1[i]-Value1[i-1]>0&&Value1[i]>0)
   Value2[i]=Value1[i];

есть бред, но как тогда написать следующее:

Если разность Value1 текущего бара и Value1 предыдущего бара больше нуля и Value1 текущего бара (отдельно) больше нуля, то присвоить значению Value2 значение Value1.


З.Ы.Ы.

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

Буду весьма благодарен, если посоветуете.

 

З.Ы.Ы.

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

Буду весьма благодарен, если посоветуете.

Сложно что-либо посоветовать, но еще раз могу "тыкнуть" в грубые ошибки в коде, посмотрите на код с моими комментариями

int start()
  {
   int counted_bars;
   int limit;
   int i;
   
   if(counted_bars<0) return(-1);
   // перед началом использования и далее переменная counted_bars не проиницилизирована
   
   limit=Bars-Q-R-S-counted_bars;
   
   for (i=limit;i>=0;i--)
   {
   Value1[i]=iCustom(NULL,0,"SMI",Q,R,S,0,0,0,i);
   }
   // Цикл окончен, i==0, дальше Вы сраниваете if(Value1[0]-Value1[-1]>0&&Value1[0]>0) Само по себе ошибка, 
   // да плюс по логике скорее эти сравнения должны быть в цикле, а не после него.
   if(Value1[i]-Value1[i-1]>0&&Value1[i]>0)
   Value2[i]=Value1[i];
   else
   Value2[i]=0;
   
   if(Value1[i]-Value1[i-1]<0&&Value1[i]<0)
   Value3[i]=Value1[i];
   else
   Value3[i]=0;
   
   ...
  }
А начинать всегда лучше с азов. Начните с написания или разбора кода самого простого индикатора.
 

Сложно иногда понять чего хочет получить человек...Вот код, попробуйте может это хотели.. Если какие вопросы или помощь, обращайтесь на tradexperts@inbox.ru..

//+------------------------------------------------------------------+
//| SMI Trade.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_level1 0

extern int Q=14;
extern int R=10;
extern int S=14;

double SMI_Trade[];
double Value1[];
double Value2[];
double Value3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexBuffer(0,Value2);
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(1,Value3);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexBuffer(2,Value1);
SetIndexBuffer(3,SMI_Trade);

return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars;
int limit;
int i;

if(counted_bars<0) return(-1);

limit=Bars-Q-R-S-counted_bars;

for (i=limit;i>=0;i--)
{
Value1[i]=iCustom(NULL,0,"SMI",Q,R,S,0,0,0,i);

if((Value1[i]-Value1[i+1])>0)Value2[i]=Value1[i];
else Value2[i]=0;

if((Value1[i]-Value1[i+1])<0)Value3[i]=Value1[i];
else Value3[i]=0;
}

for (i=limit;i>=0;i--)
SMI_Trade[i]=Value2[i]+Value3[i];

return(0);
}
//+------------------------------------------------------------------+

 

Приветик. Пожалуйста подскажите. На несколько вопросов?

Вот первый :

  • Чтобы выбрать ордер, нужно составить такой код
  • for (int i=0; i<=OrdersHistoryTotal(); i++) {//смотрим всю историю счёта
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) break;//выбираем из закрытых ордеров 
        if (OrderSymbol()!=Symbol()) continue;  {//если символ соответствует - продолжаем
          if (OrderComment()=="[tp]"            {//есть позиции, закрытые по тейку
              Print("есть позиции закрытые по тейку"); return(0);
                                                } 
                                                }
                                                }
    Правильно выполнен этот код? Если правильно, то как надо сделать чтобы я смогла выбирать не по всей истории счета, а только из заданного количества N последних ордеров.
  • Заранее спасибо
 

Ну не совсем правильно,информация о том как закрылся ордер не содержится в соменте, справку по функциям работы сордерами вы можете посмотреть Здесь

Еще очень рекомендую заглянуть сюда

 
xrust:

Ну не совсем правильно,информация о том как закрылся ордер не содержится в соменте, справку по функциям работы сордерами вы можете посмотреть Здесь

Еще очень рекомендую заглянуть сюда

Посмотрела. Мне подходят фунуции И.КИМа.

А почему не содержатся - если как раз содержаться! А для чего же в истории счёиа есть "[tp]" и "[sl]" - это разве не информация?

А вот как выбирать не по всей истории счета, а только из заданного количества N последних ордеров - там нет

 

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

А почему не содержатся - если как раз содержаться! А для чего же в истории счёиа есть "[tp]" и "[sl]" - это разве не информация?
Конкретно в OrderComment() не содержатся.
 
Спасибо за ответ. Вот нашла по вашей ссылке

Функция isCloseLastPosByTake().

Эта функция возвращает флаг закрытия последней позиции по тейку. Флаг поднят - True - сработал TakeProfit. Флаг опущен - False - позиция была закрыта по другой причине

У меня есть действие которое будет зависить от этой функции

int mmm=false;
if (isCloseLastPosByTake()) {mmmm=true;}

А возможно ли - чтобы mmm изначально равное =0(false) становилось равным =true, только тогда, когда функция isCloseLastPosByTake() меняет знак c false на true

А при обратном изменении isCloseLastPosByTake() с true на false не реагировало и продолжало оставться =true, пока я его сама принудительно не обнулю каким-ниб. условием?

Как это написать?

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