Скачать MetaTrader 5

Вопрос по мультивалютному советнику

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

Добрый вечер!

Задумал соединить две пары в один советник. Сделал это.

Но вдруг засомневался. А сделал так:

extern bool    GBP=true;
extern bool    EUR=true;
- - - - - - - - - - - - - - - - - - - -
int start()
  {
double A = iRSI("GBPUSD", 0, .....);
double B = iRSI("GBPUSD", 0, .....);
 
double C = iRSI("EURUSD", 0, .....);
double D = iRSI("EURUSD", 0, .....);
//------------------------------------------------------
if (GBP) {//если есть разрешение true
if (A<B)
{
double   BID = MarketInfo("GBPUSD", MODE_BID);
 double   ASK = MarketInfo("GBPUSD", MODE_ASK);
 double POINT =MarketInfo("GBPUSD",MODE_POINT);
(ticket=OrderSend .... //ПОКУПАЕМ/ПРОДАЕМ...)     }}}
//----------------------------------------------------------  
if (EUR) { //если есть разрешение true
if (C>D)
{
double   BID = MarketInfo("EURUSD", MODE____BID);
 double   ASK = MarketInfo("EURUSD", MODE____ASK);
 double POINT =MarketInfo("EURUSD",MODE____POINT);
(ticket=OrderSend .... //ПОКУПАЕМ/ПРОДАЕМ...)      }}}
//------------------------------------------------------------
return(0);  
  }

В онлайне и в тестере всё работает! Может сделано не совсем правильно? а надо бы сделать так:

extern bool    GBP=true;
extern bool    EUR=true;
- - - - - - - - - - - - - - - - - - - -
int start()
  {
//------------------------------------------------------
if (GBP) //если есть разрешение true{
 
double C = iRSI("GBPUSD", 0, .....);
double D = iRSI("GBPUSD", 0, .....); 
 if (A<B)
{
double   BID = MarketInfo("GBPUSD", MODE_BID);
 double   ASK = MarketInfo("GBPUSD", MODE_ASK);
 double POINT =MarketInfo("GBPUSD",MODE_POINT);
(ticket=OrderSend .... //ПОКУПАЕМ/ПРОДАЕМ...)     }}}
//----------------------------------------------------------  
if (EUR) { //если есть разрешение true
 
double C = iRSI("EURUSD", 0, .....);
double D = iRSI("EURUSD", 0, .....);
 if (C>D)
{
double   BID = MarketInfo("EURUSD", MODE____BID);
 double   ASK = MarketInfo("EURUSD", MODE____ASK);
 double POINT =MarketInfo("EURUSD",MODE____POINT);
(ticket=OrderSend .... //ПОКУПАЕМ/ПРОДАЕМ...)      }}}
//------------------------------------------------------------
return(0);  
  }
Второй вариант тоже в тестере вроде работает.

Но как будет лучше сделать?

klerk
75
klerk  
rid:

Добрый вечер!


Задумал соединить две пары в один советник. Сделал это.


Но вдруг засомневался. А сделал так:

extern bool    GBP=true;
extern bool    EUR=true;
- - - - - - - - - - - - - - - - - - - -
int start()
  {
double A = iRSI("GBPUSD", 0, .....);
double B = iRSI("GBPUSD", 0, .....);
 
double C = iRSI("EURUSD", 0, .....);
double D = iRSI("EURUSD", 0, .....);
//------------------------------------------------------
if (GBP) {//если есть разрешение true
if (A<B)
{
double   BID = MarketInfo("GBPUSD", MODE_BID);
 double   ASK = MarketInfo("GBPUSD", MODE_ASK);
 double POINT =MarketInfo("GBPUSD",MODE_POINT);
(ticket=OrderSend .... //ПОКУПАЕМ/ПРОДАЕМ...)     }}}
//----------------------------------------------------------  
if (EUR) { //если есть разрешение true
if (C>D)
{
double   BID = MarketInfo("EURUSD", MODE____BID);
 double   ASK = MarketInfo("EURUSD", MODE____ASK);
 double POINT =MarketInfo("EURUSD",MODE____POINT);
(ticket=OrderSend .... //ПОКУПАЕМ/ПРОДАЕМ...)      }}}
//------------------------------------------------------------
return(0);  
  }

В онлайне и в тестере всё работает! Может сделано не совсем правильно? а надо бы сделать так:

extern bool    GBP=true;
extern bool    EUR=true;
- - - - - - - - - - - - - - - - - - - -
int start()
  {
//------------------------------------------------------
if (GBP) //если есть разрешение true{
 
double C = iRSI("GBPUSD", 0, .....);
double D = iRSI("GBPUSD", 0, .....); 
 if (A<B)
{
double   BID = MarketInfo("GBPUSD", MODE_BID);
 double   ASK = MarketInfo("GBPUSD", MODE_ASK);
 double POINT =MarketInfo("GBPUSD",MODE_POINT);
(ticket=OrderSend .... //ПОКУПАЕМ/ПРОДАЕМ...)     }}}
//----------------------------------------------------------  
if (EUR) { //если есть разрешение true
 
double C = iRSI("EURUSD", 0, .....);
double D = iRSI("EURUSD", 0, .....);
 if (C>D)
{
double   BID = MarketInfo("EURUSD", MODE____BID);
 double   ASK = MarketInfo("EURUSD", MODE____ASK);
 double POINT =MarketInfo("EURUSD",MODE____POINT);
(ticket=OrderSend .... //ПОКУПАЕМ/ПРОДАЕМ...)      }}}
//------------------------------------------------------------
return(0);  
  }
Второй вариант тоже в тестере вроде работает.

Но как будет лучше сделать?




я обычно вычисляю все значения индикаторов в начале, то-бишь вариант 1, так проще, не запутаешься и код более структурирован.
Rid
3170
Rid  

Спасибо! За ответ. И ещё вопрос. Никак не хотят работать трейлинг стопы. По отдельности в тестере работают!

А в онлайне по одной паре работает. Но по другой печатает ошибку - сразу при включении советника.

Но сделки идут - только без трала по второй паре.

Error 130 modifying SL

int start()
  {
РАСЧЁТ  ИНДИКАТОРОВ 
{
ПОКУПКА/ПРОДАЖА
  }
 
for (int j=0; j<OrdersTotal(); j++)                                    {
    if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))                     {
     if (OrderSymbol()=="GBPUSD" && OrderMagicNumber()==Magic1)          {
ИДЕТ КОД 1 ТРЕЙЛИНГА.
   }
 
for (int r=0; r<OrdersTotal(); r++)                                    {
    if (OrderSelect(r, SELECT_BY_POS, MODE_TRADES))                     {
     if (OrderSymbol()=="EURUSD" && OrderMagicNumber()==Magic2)          {
ИДЕТ КОД 2 ТРЕЙЛИНГА
}
 
return(0);  
  }
Коды трейлингов одинаковые, но внешние и внутр. переменные заданы разными символами.

Не могу разобраться, в чем дело. Может подскажет кто?

klerk
75
klerk  
попробуй так
int start()
{
//РАСЧЁТ  ИНДИКАТОРОВ 
 
//ПОКУПКА/ПРОДАЖА
  
 
for (int j=0; j<OrdersTotal(); j++)
  {
    if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
       {
          if (OrderSymbol()=="GBPUSD" && OrderMagicNumber()==Magic1)         
              {
                  ИДЕТ КОД 1 ТРЕЙЛИНГА.
              }
          if (OrderSymbol()=="EURUSD" && OrderMagicNumber()==Magic2)   
              {
                  ИДЕТ КОД 2 ТРЕЙЛИНГА
              }
        }
   }
 
 
  return(0);  
}
klerk
75
klerk  
структурируй код, будет легче разобраться и людям, и тебе.
Rid
3170
Rid  

Попробую, спасибо.

Rid
3170
Rid  

Вроде бы заработало!

Ошибку пока не печатает. Жду профита для проверки трала.

Еще есть вопросы. Если не трудно.

Нигде практически нет простейших примеров мультивалютных эксперитов. А где есть - там не для слабого ума. Всего наворочено - не разобраться.

в моем коде есть :

 double   BID = MarketInfo("GBPUSD", MODE_BID);
 double   ASK = MarketInfo("GBPUSD", MODE_ASK);
 double POINT =MarketInfo("GBPUSD",MODE_POINT);
//-------Проверяем условие на покупку-------------
if  (

Однако в редких примерах на этом сайте при аналогичном блоке присутствует строка:

RefreshRates();
 double BID = MarketInfo("GBPUSD", MODE_BID);
 double ASK = MarketInfo("GBPUSD", MODE_ASK);
 double POINT =MarketInfo("GBPUSD",MODE_POINT);

Я ТОЖЕ вставил эту строку. Скомпелировалось. Но изменений не замечаю в работе.

Насколько она здесь необходима? Возможно её нужно оставить в моем советнике?. Он работает по всем тикам. И там используется массив значений -

//------заполняем массив значениями RSI GBPUSD -----------
 double RSI_array[30];
int    i=0;
while (i<31)
 {
RSI_array[i]=iRSI("GBPUSD",0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,i);
i++;

klerk
75
klerk  
принцип мултивалютного эксперта примерно следующий:
1. в расчете индикаторов указывать конкретные валюты и временные интервалы, например: iRSI("GBPUSD",60,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,i); //кстати вот и ошибка
2. получать с помощью MarketInfo цены, пункты и т.д.
3. вместо например Low[0] использовать iLow(...)
и пиши, хоть на все валютные пары.
Удачи.
Rid
3170
Rid  

Понял про ошибку! Вместо "0" - проставил в переменных индикаторов по валютам - тф, на котором работает советник.

Работает вроде мой эксперт без сбоев. И тралы работают.

И ещё, надеюсь, последний вопрос. Вставил ещё одну. Третью пару. Но вызвал не встроенный, а пользовательский индикатор. В тестере эта пара работает. А вот в онлайне, - не хочет! Печатает что-то непонятное: почти каждую секунду этот индюк ставится и удаляется. ..... - может что посоветуете?

//***************************************************************

kLerk ! Из всех присутствующих специалистов за неделю - лишь Вы один откликнулись на мой вопрос. И я получил ответы, которые меня в основном устраивают. ( За исключ. вопроса о RefreshRates() )

Прошу Вас поставить здесь ваш адрес эл. почты.

Я, в знак благодарности, пришлю вам простой торговый "Грааль" - советник!, кот. придумал мой хороший приятель.(согласовано). Работаю с ним при ручном подтверждении. Используется всего два встроенных индюка.

Без иронии, -то что это действительно почти "Грааль"(при некот. навыке работы с ним), - ВЫ убедитесть через неск. минут после его получения! Впрочем - пусть посмотрят все :

Символ ---------

Период 30 Минут (M30) 2007.01.02 11:00 - 2007.08.15 00:00

Модель Все тики (на основе всех наименьших доступных периодов с фрактальной интерполяцией каждого тика)

Качество моделирования 67.35%

Начальный депозит 10000.00

Чистая прибыль 4009.24

Общая прибыль 6335.06 Общий убыток -2325.82

Прибыльность 2.72 Матожидание выигрыша 21.44

Максимальная просадка 245.63 (2.18%) Относительная просадка 2.18% (245. 63)

Всего сделок 187

Короткие позиции (% выигравших) 71 (80.28%)

Длинные позиции (% выигравших) 116 (68.10%)

Прибыльные сделки (% от всех) 136 (72.73%)

Убыточные сделки (% от всех) 51 (27.27%)

Самая большая прибыльная сделка 145.02, убыточная сделка -47. 77

Средняя прибыльная сделка 46.58, убыточная сделка -45.60

Максимальное количество непрерывных выигрышей (прибыль) 9 (586. 96)

непрерывных проигрышей (убыток) 4 (-189.99

А вот график теста вне репрезент. выборки за ноябрь/дек. предыд. 2006 года:

Валерий
1433
Валерий  
rid:

Я, в знак благодарности, пришлю вам простой торговый "Грааль" - советник!, ...

Поздравляю, klerk, на шару получили грааль !
Alexandre
602
Alexandre  
<<Печатает что-то непонятное: почти каждую секунду этот индюк ставится и удаляется...... - может что посоветуете?>>

Скорее всего, фактические параметры, с которыми вызывается пользовательский индикатор, не соответствуют формальным, перечисленным с ключом extern в листинге (число, порядок, тип, ...). Довольно распространенная ошибка.
1234567891011121314
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий