Вопрос к знатокам 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, пока я его сама принудительно не обнулю каким-ниб. условием?

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