Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Натали
87
Натали  
#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;
                }
}
o_o
Модератор
24034
o_o  
почему-то вспоминается Задоронов - "скажите я правильно иду?"
Натали
87
Натали  
sergeev:

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

И?
Nikolay Demko
12547
Nikolay Demko  
sergeev:

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

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

to funnynatka

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

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

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


Натали
87
Натали  
Urain:

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

to funnynatka

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

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

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



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

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

Олег avtomat
5430
Олег avtomat  

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

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

Alexander
2441
Alexander  
Какая между ними принципиальная разница?
Олег avtomat
5430
Олег avtomat  

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

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

Vladyslav Goshkov
2148
Vladyslav Goshkov  

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 : обратил внимание.

Alexander
2441
Alexander  
VladislavVG:

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

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

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

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

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

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

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

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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий