Посмотрите пожалуйста работу. Правильность выполнения действий. (Правильно ли поступила с индикатором?)

 
#property copyright "Lazorenko Natalia"


extern int takeprofit=?;
extern double Lots=0.1;
extern int stoploss=100;
extern int period_RSI=14;

string Symb; //название финансового инструмента
double SL,TP;
double LOT;
int k;
int flag=0;
int TimeBar=0;
double upper_threshold=70; // верхний порог
double lower_threshold=30; // нижний порог

//--------------------------------------------------------------------
int start()
{
   if (TimeBar==Time[0]) return(0);
   if (TimeBar==0) {TimeBar=Time[0];return(0);} //первый запуск программы 
   double RSI = iRSI(NULL, 0, period_RSI, PRICE_OPEN, 0); //присваиваем переменной RSI значение индикатора


if (RSI > upper_threshold) // если индикатор выше верхнего предела, flag=1
        {flag=1;}
else
        {if (RSI < lower_threshold) // если индикатор ниже  нижнего предела, flag=-1
                {flag=-1;}
         else flag=0; // иначе flag=0
        }

if (MathAbs(flag)==1)
      {
                if (flag>0) 
                        {
                         TimeBar=Time[0];
                         RefreshRates();
                         TP = Ask + takeprofit*Point;
                         SL = Bid - stoploss*Point;
                         k=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),0,SL,TP,NULL, 0,0,Red);
                         if (k<0) {ShowERROR(k) ;return(0);}
                      
                        }
                 if (flag<0)
                        {
                         TimeBar=Time[0];
                         RefreshRates();
                         TP = Bid - takeprofit*Point;
                         SL = Ask + stoploss*Point;
                         k=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),0,SL,TP,NULL, 0,0,Red);
                         if (k<0){ShowERROR(k); return(0);}
                         
                        }
       }
if (k==-1) //неудачная покупка
                        {
                         ShowERROR(k);
                        }
return;
}
        
//--------------------------------------------------------------------
void ShowERROR(int Ticket)
{
        int err=GetLastError();
        switch ( err )
                {
      case 2:   Alert("Нет связи с торговым сервером   "              ,Ticket," ",Symbol());return;
      case 3:   Alert("Error  неправильные параметры   Ticket ",       Ticket," ",Symbol());return;
      case 130: Alert("Error близкие стопы   Ticket ",                 Ticket," ",Symbol());return;
      case 134: Alert("Недостаточно денег   ",                         Ticket," ",Symbol());return;
      case 146: Alert("Error Подсистема торговли занята ",             Ticket," ",Symbol());return;
      case 129: Alert("Error Неправильная цена ",                      Ticket," ",Symbol());return;
      case 131: Alert("Error Неправильный объем ",                     Ticket," ",Symbol());return;
      case 4051:Alert("Error Недопустимое значение параметра функции ",Ticket," ",Symbol());return;
      case 4105:Alert("Error Ни один ордер не выбран ",                Ticket," ",Symbol());return;
      case 4063:Alert("Error Ожидается параметр типа integer ",        Ticket," ",Symbol());return;
      case 4200:Alert("Error Объект уже существует ",                  Ticket," ",Symbol());return;
      default:  Alert("Error  " ,err,"   Ticket ",                     Ticket," ",Symbol());return;
                }
}
 
почему-то вспоминается Задоронов - "скажите я правильно иду?"
 
sergeev:

почему-то вспоминается Задоронов - "скажите я правильно иду?"

И?
 
sergeev:

почему-то вспоминается Задоронов - "скажите я правильно иду?"

Да да правильно :о)

to funnynatka

я бы ещё в ините проставил проверку чтоб SL или TP не был меньше стоплевела.

И ещё, вы собираетесь открывать ордера пока существует сигнал, или всё таки один раз при появлении сигнала?

если последнее то стоит проставить защиту от повторного открытия если сигнал уже был отработан.


 
Urain:

Да да правильно :о)

to funnynatka

я бы ещё в ините проставил проверку чтоб SL или TP не был меньше стоплевела.

И ещё, вы собираетесь открывать ордера пока существует сигнал, или всё таки один раз при появлении сигнала?

если последнее то стоит проставить защиту от повторного открытия если сигнал уже был отработан.



Да, один раз при появлении сигнала. ))

А каким образом это сделать?

 

назначить множество значений для переменной flag = 0, 1, 2

вместо 0, 1, -1

 
Какая между ними принципиальная разница?
 

а зачем лишние проверки?

впрочем не принципиально...

 

funnynatka:

#property copyright "Lazorenko Natalia"


extern int takeprofit=?;
extern double Lots=0.1;
extern int stoploss=100;
extern int period_RSI=14;

string Symb; //название финансового инструмента
double SL,TP;
double LOT;
int k;
int flag=0;
int TimeBar=0;
double upper_threshold=70; // верхний порог
double lower_threshold=30; // нижний порог

//--------------------------------------------------------------------
int start()
{
   if (TimeBar==Time[0]) return(0);
   if (TimeBar==0) {TimeBar=Time[0];return(0);} //первый запуск программы 
   double RSI = iRSI(NULL, 0, period_RSI, PRICE_OPEN, 0); //присваиваем переменной RSI значение индикатора


if (RSI > upper_threshold) // если индикатор выше верхнего предела, flag=1
        {flag=1;}
else
        {if (RSI < lower_threshold) // если индикатор ниже  нижнего предела, flag=-1
                {flag=-1;}
         else flag=0; // иначе flag=0
        }

if (MathAbs(flag)==1)
      {
                if (flag>0) 
                        {
                         TimeBar=Time[0];
                         RefreshRates();
                         TP = Ask + takeprofit*Point;
                         SL = Bid - stoploss*Point;
                         k=OrderSend(Symbol(),OP_BUY,0.1,NormalizeDouble(Ask,Digits),0,SL,TP,NULL, 0,0,Red);
                         if (k<0) {ShowERROR(k) ;return(0);}
                      
                        }
                 if (flag<0)
                        {
                         TimeBar=Time[0];
                         RefreshRates();
                         TP = Bid - takeprofit*Point;
                         SL = Ask + stoploss*Point;
                         k=OrderSend(Symbol(),OP_SELL,0.1,NormalizeDouble(Bid,Digits),0,SL,TP,NULL, 0,0,Red);
                         if (k<0){ShowERROR(k); return(0);}
                         
                        }
       }
if (k==-1) //неудачная покупка
                        {
                         ShowERROR(k);
                        }
return;
}
        
//--------------------------------------------------------------------
void ShowERROR(int Ticket)
{
        int err=GetLastError();
        switch ( err )
                {
      case 2:   Alert("Нет связи с торговым сервером   "              ,Ticket," ",Symbol());return;
      case 3:   Alert("Error  неправильные параметры   Ticket ",       Ticket," ",Symbol());return;
      case 130: Alert("Error близкие стопы   Ticket ",                 Ticket," ",Symbol());return;
      case 134: Alert("Недостаточно денег   ",                         Ticket," ",Symbol());return;
      case 146: Alert("Error Подсистема торговли занята ",             Ticket," ",Symbol());return;
      case 129: Alert("Error Неправильная цена ",                      Ticket," ",Symbol());return;
      case 131: Alert("Error Неправильный объем ",                     Ticket," ",Symbol());return;
      case 4051:Alert("Error Недопустимое значение параметра функции ",Ticket," ",Symbol());return;
      case 4105:Alert("Error Ни один ордер не выбран ",                Ticket," ",Symbol());return;
      case 4063:Alert("Error Ожидается параметр типа integer ",        Ticket," ",Symbol());return;
      case 4200:Alert("Error Объект уже существует ",                  Ticket," ",Symbol());return;
      default:  Alert("Error  " ,err,"   Ticket ",                     Ticket," ",Symbol());return;
                }
}

Натали, абсолютно не принипиально как Вы поступили с индикатором: в таком варианте программа все равно до его вызова не доберется. Ошибку в логике выделил.

И еще: использование абсолютных кодов ошибок в функции их обработки - void ShowERROR(int Ticket)- это плохой стиль программирования, используйте мнемонические имена: коды, в принципе, могут быть изменены.

ЗЫ Не доглядел место переопределения переменной TimeBar. Спасибо Roger : обратил внимание.

 
VladislavVG:

Натали, абсолютно не принипиально как Вы поступили с индикатором: в таком варианте программа все равно до его вызова не доберется. Ошибку в логике выделил.

А мне кажется именно эта часть у нее прописана безукоризненно.
 
Roger:
А мне кажется именно эта часть у нее прописана безукоризненно.

Возможно и ошибаюсь. Симотрим:

первый тик: вход - TimeBar=0; и не равно Time[0]. Будет присвоение и возврат.

второй тик: TimeBar== Time[0], возврат

и так до конца бара, на котором запущен советник.

После формирования бара, на котором был запущен советник, переменная TimeBar изменяться не будет (поскольку не выполнится ни одно из условий : переменная не будет навна ни нулю, ни времени начала текущего бара) и будет равна времени того бара, на котором был запущен советник.

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

Может, я где-то ошибаюсь ?

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