Как запустить советника для нескольких пар? - страница 3

 

Жак, я ценю ваш постоянный интерес к этой теме. Я все еще отлаживаю свой советник для его первой валюты, но намерен использовать его на нескольких, если он будет признан подходящим. Исходя из этого, я обдумываю стратегию, как реализовать эту идею. Таким образом, я заинтересовался этой темой.


В соответствии с вашей просьбой, я подготовил графики еще для трех пар, и при этом обнаружил, что две из них имели более 32 000 тиков за 24-часовой период (предел данных для построения графиков в Excel). В результате мне пришлось разбить график на два периода (1-й 12 часов и 2-й 12 часов). Чтобы сохранить относительную последовательность, я разбил все три пары на 12-часовые периоды.


Следует помнить, что вертикальная шкала на этих графиках пропорциональна горизонтальным линиям, но горизонтальная шкала НЕ пропорциональна времени (т.е. нельзя считать, что 1/12 тика представляет собой один час).


Я думаю, что главный вывод из этих графиков заключается в том, что у всех пар есть периоды в 24-часовом периоде, когда между тиками есть значительные интервалы. В результате, если вы объедините несколько пар в одном советнике, я думаю, будет разумно использовать цикл "While". Ссылка StraightTrader на https://book.mql4.com/special/index под названием "Общие характеристики сложных программ" содержит хорошее обсуждение этой техники и график во вступительном разделе этой статьи.


GBPJPY 44,834 тиков за 24 часа

EURJPY 37,140 тиков за 24 часа

GBPUSD 29,313 тиков за 24 часа

EURUSD 22,627 тиков за 24 часа













Будьте здоровы!

 
FXtrader2008:

В результате, если вы объедините несколько пар в одном советнике, я думаю, что будет разумно использовать цикл "While". На сайте StraightTrader https://book.mql4.com/special/index под названием "Общие характеристики сложных программ" есть хорошее обсуждение этой техники и график во вступительном разделе этой статьи.

Это именно тот случай. Несколько пар в одном советнике -> использование подхода цикла while loop вместо активации функции запуска по входящим тикам.


Я бы хотел быть против одной валютной пары для одного советника.

Мой долгосрочный подход - ОДИН МНОГОКРАТНЫЙ МНОГОСТРАТЕГИЧЕСКИЙ советник. Некоторое время назад я подготовил схему универсального совет ника, которая реализует некоторые из этих идей.

Позже, не включенный в мой пост, я продолжил разработку этого кода и начал проект Google кода под названием Universaltrader. Этот проект может оправдать ваши ожидания. Единственное, что там не реализовано, это отмеченный подход While cycle (легко реализуемый).


Некоторые из преимуществ советника MULTICURRENCY MULTISTRATEGY EA:

  • все стратегии вместе
  • возможность настраивать/создавать все стратегии вместе, а также независимо друг от друга
  • возможность включать/выключать различные стратегии/валютные пары
  • Я уверен, что есть еще много других преимуществ

недостатки:

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

Этот проект еще нуждается в доработке, так что если у кого-то есть интерес, я могу пригласить его в этот проект Google code


Текущий скрипт прикреплен здесь:

Файлы:
 
FXtrader2008 wrote >>

Жак, я ценю ваш постоянный интерес к этой теме. Я все еще отлаживаю свой советник для его первой валюты, но намерен использовать его на нескольких, если он будет признан подходящим. Исходя из этого, я обдумываю стратегию, как реализовать эту идею. Таким образом, я заинтересовался этой темой.

В соответствии с вашей просьбой, я подготовил графики еще для трех пар, и при этом обнаружил, что две из них имеют более 32 000 тиков за 24-часовой период (предел данных для построения графиков в Excel). В результате мне пришлось разбить график на два периода (1-й 12 часов и 2-й 12 часов). Чтобы сохранить относительную последовательность, я разбил все три пары на 12-часовые периоды.

Следует помнить, что вертикальная шкала на этих графиках пропорциональна горизонтальным линиям, но горизонтальная шкала НЕ пропорциональна времени (т.е. нельзя считать, что 1/12 тиков представляет собой один час).

Я думаю, что главный вывод из этих графиков заключается в том, что у всех пар есть периоды в 24-часовом периоде, когда между тиками есть значительные интервалы. В результате, если вы объедините несколько пар в одном советнике, я думаю, будет разумно использовать цикл "While". Ссылка StraightTrader на https://book.mql4.com/special/index под названием "Общие характеристики сложных программ" содержит хорошее обсуждение этой техники и график во вступительном разделе этой статьи.

GBPJPY 44,834 тиков за 24 часа

EURJPY 37,140 тиков за 24 часа

GBPUSD 29,313 тиков за 24 часа

EURUSD 22,627 тиков за 24 часа

Ура!

Большое спасибо за ваши графики.

Мы выбрали цикл вместо активации тикового прогона, это будет более научно для тех, кому нужна минутная точность, и это не очень сложно реализовать. Еще одним преимуществом является то, что вы можете прикрепить советника к любой валютной паре, которую вы хотите (это полезно, когда он рисует объект на графике).

Ваше здоровье

 
cloudbreaker wrote >>

И вы можете получить последние цены спроса и предложения для символов вне текущего графика с помощью функции MarketInfo().

Таким образом, у вас есть следующие варианты.

- Прикрепить один и тот же советник ко многим графикам и работать для "родного" символа каждого графика (используя встроенные переменные Ask и Bid)

- иметь советника, прикрепленного к определенному графику, который работает для всех выбранных символов (с функцией MarketInfo() для неродных символов) - просто используя тики родного символа в качестве триггера

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

Сейчас я использую самую простую из этих стратегий - у меня есть советник на трех таймфреймах по четырем валютам, всего их двенадцать. Все они настроены на запуск на первом тике таймфрейма. Однако у меня возникла проблема: MT4 не всегда выполняет все советники. Я поместил оператор print сразу после функции start, чтобы посмотреть, что происходит, и он попадал только в три из четырех советников, например, для H1, но он пропускал разные пары в разное время, и советник был идентичен, за исключением настроек оптимизации для каждой пары.

Вопрос - Выполняет ли MT4 только одного советника за раз, когда несколько советников настроены на одновременный запуск? Зависит ли выполнение одного советника от выполнения другого (кроме того, что торговый контекст занят), или они полностью независимы?

Если да, то я мог бы использовать второй вариант, я просто пытаюсь сделать советника как можно проще, потому что, по крайней мере для меня, чем сложнее я пишу, тем больше ошибок я делаю.

 
joetrader:

Сейчас я использую самую простую из этих стратегий - у меня есть советник на трех таймфреймах по четырем валютам, так что всего их двенадцать. Все они настроены на запуск на первом тике таймфрейма. Однако у меня возникла проблема: MT4 не всегда выполняет все советники. Я поместил оператор print сразу после функции start, чтобы посмотреть, что происходит, и он попадал только в три из четырех советников, например, для H1, но он пропускал разные пары в разное время, и советник был идентичен, за исключением настроек оптимизации для каждой пары.

Вопрос - Выполняет ли MT4 только одного советника за раз, когда несколько советников настроены на одновременный запуск? Зависит ли выполнение одного советника от выполнения другого (кроме того, что торговый контекст занят), или они полностью независимы?

Если да, то я мог бы использовать второй вариант, я просто пытаюсь сделать советника как можно проще, потому что, по крайней мере для меня, чем сложнее я пишу, тем больше ошибок я делаю.

У меня есть несколько советников, работающих на графиках без подобных проблем. Насколько я могу судить, они работают одновременно, и замечают друг друга только тогда, когда торговый контекст используется одним из них. Что касается самого советника, то он полностью независим - у каждого своя копия переменных и т.д. Позвольте мне просто прояснить ситуацию - вы запускаете 12 советников, прикрепленных к 12 графикам? Может быть, у вас проблемы с памятью?

 
gordon wrote >>

У меня есть несколько советников, работающих на графиках без подобных проблем. Насколько я могу судить, они работают одновременно, и замечают друг друга только тогда, когда торговый контекст используется одним из них. Что касается самого советника, то он полностью независим - у каждого своя копия переменных и т.д. Позвольте мне просто прояснить ситуацию - вы запускаете 12 советников, прикрепленных к 12 графикам? Может быть, у вас проблемы с памятью?

Правильно. 12 советников на 12 графиках. Довольно новый компьютер с 6 ГБ памяти, так что я не думаю, что дело в памяти, но это стоит рассмотреть, и я не буду это исключать. Но вы ответили на мой вопрос - если предполагается, что советники могут работать одновременно, то, возможно, я просто делаю что-то неправильно. Не в первый раз! Я проверю код и изучу еще немного. Спасибо за помощь.

 
Вы запускаете графики в разных экземплярах клиента MT4? Если вы открываете все графики в одном экземпляре, то они будут иметь общий торговый контекст, и вам нужно будет ввести логику для обмена этим контекстом - если поведение ваших советников означает, что несколько из них, вероятно, будут выполнять торговые операции в одно и то же время. CB
 
cloudbreaker wrote >>
Вы запускаете графики в разных экземплярах клиента MT4? Если вы открываете все графики в одном экземпляре, то они будут использовать один торговый контекст, и вам нужно будет ввести логику для совместного использования этого контекста - если поведение ваших советников означает, что несколько из них, вероятно, будут выполнять торговые операции в одно и то же время. CB

Да - я запускаю их на одном и том же клиенте MT4. Но я использую одно из решений по занятости торгового контекста из этой статьи https://www.mql5.com/en/articles/1412 и не получаю никаких ошибок занятости торгового контекста.

Кажется, он даже не доходит до момента, когда пытается открыть позицию. Для некоторых советник вообще не запускается. Я говорю так, потому что я поместил оператор печати в начало моей функции запуска.

Вот моя функция start:

void start()
{
//---- торговать только на первых тиках нового бара
if(Volume[0]>1) return;
Print("Tick Check");

if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
}

Я торгую на CADJPY, EURCHF, GBPUSD и USDJPY.

И я получаю следующее:

2010.01.22 8:59:45 [EAName]USDJPY, H1: Проверка тиков

2010.01.22 8:59:45 [EAName]CADJPY,H1: Проверка тиков

2010.01.22 8:59:45 [EAName]GBPUSD,H1: Проверка тиков

2010.01.22 9:59:45 [EAName]EURCHF,H1: Проверка тиков

2010.01.22 9:59:46 [EAName]GBPUSD,H1: Проверка тиков

2010.01.22 9:59:46 [EAName]CADJPY,H1: Проверка тиков

В некоторые часы все четыре будут торговать, в некоторые только три. Если в течение часа торгуются H4, то могут торговаться три из них, но обычно не все четыре, а также три или четыре H1.

Я создал обходной путь, где я увеличиваю объем до 3 или 4 тиков, чтобы убедиться, что все торгуют, но я пытаюсь лучше понять MetaTrader, чтобы устранить основную проблему.

Поэтому мой вопрос заключается в следующем - поскольку у моего советника есть только один тик для запуска, будет ли он запускать каждый советник одновременно, и, возможно, именно поэтому они не все запускаются? В моем советнике есть цикл, который сравнивает до 1500 прошлых фракталов, чтобы найти стоплосс, так что это может занять некоторое время.

Опять же, возможно, проблема где-то в моем коде.

 
Я предполагаю, что у вас проблема с кодом, и это не имеет никакого отношения к теме множественных советников. Вам нужно точно определить проблему для тех, которые не запускаются, используя стандартные методы Print()/Alert(), чтобы увидеть, что не работает.
 
tigersoft:
Вот простой код для открытия EURUSD и USDCHF на одном графике. Даже если ea добавлена на другой график, она будет открывать EURUSD и USDCHF.

//+------------------------------------------------------------------+
//|                                                          jkh.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

bool wannaBuy = true;
bool wannaBuy1 = true;
extern double LotSize = 0.01;
extern string symbol1 = "EURUSD";
extern string symbol2 = "USDCHF";
extern int MaxDifference = 6;
extern int Slippage = 3;
extern int Magicnumber1 = 786;
extern int Magicnumber2 = 123;
int sendticket = 3;
string pairs[18];

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
pairs[0] = symbol1;
pairs[1] = symbol2;
wannaBuy = true;
wannaBuy1 = true;

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   // Send order for EURUSD & USDCHF
   if (wannaBuy) {   
   int ticket1;
   RefreshRates();
   ticket1 = OrderSend(symbol1, OP_BUY, LotSize, MarketInfo(symbol1,MODE_ASK), Slippage, 0, 0, 0,0,Magicnumber1,0) & OrderSend(symbol2, OP_BUY, LotSize, MarketInfo(symbol2,MODE_ASK), Slippage, 0, 0, 0,0,Magicnumber2,0);
   if (ticket1 <0 )
   {
   Print ("OrderSend failed with error #", GetLastError());
   return(0);
   }
   wannaBuy = false;
   }

//----
   return(0);
  }
//+------------------------------------------------------------------+

не работает?

для тестирования
получил ошибку ордеренда 4106

неизвестное имя символа для USDCHF для функции ordersend

Ordersend работает для EURUSD, если я выбираю символ EURUSD для настройки или графика EURUSD.

Если я перехожу на другой график, я получаю неизвестный символ для EURUSD и USDCHF.

Спасибо! Заранее