Скачать MetaTrader 5

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

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

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

И?
Nikolay Demko
12465
Nikolay Demko 2011.05.16 21:54  
sergeev:

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

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

to funnynatka

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

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

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


Натали
87
Натали 2011.05.16 22:09  
Urain:

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

to funnynatka

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

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

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



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

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

Олег avtomat
4894
Олег avtomat 2011.05.17 02:04  

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

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

Alexander
2441
Alexander 2011.05.17 02:07  
Какая между ними принципиальная разница?
Олег avtomat
4894
Олег avtomat 2011.05.17 02:18  

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

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

Vladyslav Goshkov
2074
Vladyslav Goshkov 2011.05.17 07:25  

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 2011.05.17 07:55  
VladislavVG:

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

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

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

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

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

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

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

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

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

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