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

 

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

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

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

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);  
  }
Второй вариант тоже в тестере вроде работает.

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

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

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

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

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

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);  
  }
Коды трейлингов одинаковые, но внешние и внутр. переменные заданы разными символами.

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

 
попробуй так
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);  
}
 
структурируй код, будет легче разобраться и людям, и тебе.
 

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

 

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

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

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

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

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

 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++;

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

Понял про ошибку! Вместо "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 года:

 
rid:

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

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

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