Скачать MetaTrader 5

Вопрос: соединить/объединить два советника?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Вся история MQL5.community в одном месте!
Stan
28
Stan 2008.07.13 16:20 
Здaравствуйте у меня такой вопрос как можно соединить два советника? И заставить их работать одноврменно или переменно для примера тик первая тик вторая.
Павел
1000
Павел 2008.07.13 16:47  
Оч просто -- код из одного перенести в другой.
Stan
28
Stan 2008.07.13 17:06  
Надо в код влезат и интегрироват входные данные есть ли возможность объединить их на уровне скрипта?
Stan
28
Stan 2008.07.13 17:06  
Надо в код влезат и интегрироват входные данные есть ли возможность объединить их на уровне скрипта?
Павел
1000
Павел 2008.07.13 17:10  

Скрипт это скрипт, а советник это советник.

Был бы код сказал бы как сделать удобней.

Stan
28
Stan 2008.07.13 17:27  
Можеш дать твой eмайл?
Валерий
1434
Валерий 2008.07.14 00:18  

Сделать это можно довольно просто, если оформить код экспертов в виде функций:

.........
// Список внешних переменных обоих экспертов
.........
extern bool Expert_1 = true; 
extern bool Expert_2 = true;

//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
if (Expert_1)  
   Expert_1(//Список фактических параметров эксперта 1);
if (Expert_2)  
   Expert_2(//Список фактических параметров эксперта 2);  
   return(0);
  }
//+------------------------------------------------------------------+
void Expert_1(//Список формальных параметров эксперта 1)
  {
   // Код эксперта 1
   .........
   return(0);
  }
void Expert_2(//Список формальных параметров эксперта 2)
  {
   // Код эксперта 2
   .........
   return(0);
  }
Александр
8459
Александр 2008.07.15 16:48  
Интересный вопрос и интересный метод реализации, спасибо Валерий. Надо обмозговать на досуге.
Александр
8459
Александр 2008.07.15 20:13  

Валерий, а есть ли какой нибудь советник на основе выше представленного шаблона? любой, абсолютно

на готовом коде мне будет проще разбираться, буду Вам очень признателен

Валерий
1434
Валерий 2008.07.16 05:13  

Эксперт по предложенной схеме работал у меня на Automated Trading Championship 2007. Там в один эксперт были интегрированы два, один работал на H1 с рынка, другой - на H4 лимитниками, написанные в разное время. Поскольку оба давали профит на истории 2007, я и решил их объединить. Эксперт благополучно слил, хотя в начале несколько раз поднимался в первую десятку, и даже пятёрку, но потом, из-за возросшей краткосрочной волатильности фунта-йены, посыпались стоп-лоссы. Кстати, при прогоне на тестере, с отключенными H1 экспертом и трейлинг стопом, показал прибыль больше, чем у Bettera. Как говорят префферансисты: "Знал бы прикуп - жил бы в Сочи, не работал бы совсем."

Я вообже думаю, что внушительный успех Bettera достигнут не столько за счёт применения нейронных сетей, сколько за счёт изначально заложенной прибыльной стратегии + благоприятное развитие рынка. Ну, посмотрим на чемпионате 2008, удастся ли ему повторить свои результаты 2007 года.

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

#include <stdlib.mqh> 
#include <stderror.mqh>
/*#import "MyLibrary.ex4"
   int Buy(string symbol, double Lots, double price, int slip, double sl, double tp, string comment,int magic );
   int Sell(string symbol, double Lots, double price, int slip, double sl, double tp,string comment,int magic);
   int SetCanal(string symbol,int Period_X);
   int SetRevers(string symbol,int Period_X);
#import*/ 
//---- input parameters
extern int TakeProfit1 = 400; 
extern int TakeProfit2 = 330;  
extern int StopLoss1 = 200;
extern int StopLoss2 = 70;
extern string _Param_Trailing_ = " --- Параметры трейлинг-стопа ---";
extern bool UseTrailing = true;
extern int MinProfit1 = 90;
extern int MinProfit2 = 35;
extern int TrailingStop1 = 35;
extern int TrailingStop2 = 35;
extern int TrailingStep1 = 35;
extern int TrailingStep2 = 100; 
extern int Distance = 17;
extern double Lots = 0;
extern int MaxOrders = 3;
extern bool Конкурс = true;
extern int PercentFreeMargin=30;
extern int MAGIC1=12345;
extern int MAGIC2=54321;
extern int MA_Long_Period=22;
extern int MA_Short_Period=4;
extern int StochPeriod=5;
extern bool StochSignal = false;
extern bool In_on_extremum = true;
extern bool In_on_cross = true;
extern bool Close_of_Open = true;
extern bool Out_on_extremum = true;
extern bool Info = true;
extern bool Screen=false;
extern bool Signals=true;
extern bool Expert_H4 = true; 
extern bool Expert_H1 = true;

datetime TimeOpen1;
datetime TimeOpen2;
static int MADiffSatl_1_S,MADiffSatl_2_S,MADiffSatl_3_S,MADiffSatl_4_S,MADiffSatl_5_S,MADiffSatl_0_S;
static int MADiffSatl_1_L,MADiffSatl_2_L,MADiffSatl_3_L,MADiffSatl_4_L,MADiffSatl_5_L,MADiffSatl_0_L;
bool Finish=false;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0); 
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
{ 
  int moda=0;
  if (Lots==0) moda=1;
  if (Expert_H1)  
   Expert_H1(TakeProfit2,StopLoss2,MAGIC2,Lots,PercentFreeMargin,PERIOD_H1,
               UseTrailing,MinProfit2,TrailingStop2,TrailingStep2,2,
               MA_Long_Period,MA_Short_Period,Out_on_extremum,Close_of_Open);
  if (Expert_H4)   
   Expert_H4(TakeProfit1,StopLoss1,UseTrailing,MinProfit1,TrailingStop1,TrailingStep1,Distance,
               Lots,PercentFreeMargin,PERIOD_H4,MAGIC1,
               MA_Long_Period,MA_Short_Period,In_on_extremum,In_on_cross,Close_of_Open,
               Info,Screen,Signals);

return;     
} //Закрытие start()

//+------------------------------------------------------------------+
//| Expert_H4 function                                               |
//+------------------------------------------------------------------+
//--------------------------   Expert_H4   -------------------------------------------------
void Expert_H4(int TakeProfit,int StopLoss,bool UseTrailing,int MinProfit,int TrailingStop,int TrailingStep,int Distance,
               double Lots,int PercentFreeMargin,int Period_X,int MAGIC,
               int MA_Long_Period,int MA_Short_Period,bool In_on_extremum,bool In_on_cross,bool Close_of_Open,
               bool Info,bool Screen,bool Signals)
{
  int      i,ticket,cmd,total,slippage=5,type,profit,FreeMargin,MarginLevel;
  double   vol,OpenPrice;
  string symbol = Symbol(),name=""; 
  int BuyCnt,SellCnt,LimitCnt;

if (UseTrailing)TrailingPositions(symbol,MAGIC,PERIOD_H4,MinProfit,TrailingStop,TrailingStep);
//----------------------------------------------------------------------------------------------------------------
//Проверка сигнала на открытие позиции
//----------------------------------------------------------------------------------------------------------------
if (Finish)return; 
if (AccountEquity() < 1000) {Finish=true;Print("Finit a la komedia");return;} 
if (NewBar_H4())   //сменился бар PERIOD_H4
{ //Print("New bar H4");
//SetCanal(symbol,Period_X);

......... // Код эксперта H4

} // Закрытие NewBar  
} 

//+------------------------------------------------------------------+
//| Expert_H1 function                                               |
//+------------------------------------------------------------------+
void Expert_H1(double TakeProfit,double StopLoss,int MAGIC,double Lots,int PercentFreeMargin,int Period_X,
               bool UseTrailing,int MinProfit,int TrailingStop,int TrailingStep,int MaxOrders,
               int MA_Long_Period,int MA_Short_Period,bool Out_on_extremum,bool Close_of_Open)
{
  int      i, ticket, total, slippage=5,type;
  double   vol,profit;
  double   risk=10;
  string symbol = Symbol();  
  int BuyCnt,SellCnt,LimitCnt;

      // Проверка трейлинг-стопа   
if (UseTrailing) TrailingPositions(symbol,MAGIC,PERIOD_H1,MinProfit,MinProfit,TrailingStep);
....... // Код на закрытие позиций
//----------------------------------------------------------------------------------------------------------------
//Проверка сигнала на открытие позиции
//----------------------------------------------------------------------------------------------------------------
if (AccountEquity() < 1000) {Finish=true;Print("Finit a la komedia");return;} 
if (NewBar_H1() && Minute()<3)   //сменился бар
{ //Print("New bar H1");

,,,,,,,,// Код на открытие позиций

}   
return;     
} 
// Описания используемых функций
.....
Александр
8459
Александр 2008.07.16 18:18  
Спасибо, Валерий, большое! Буду разбираться теперь со своими на Вашем примере :)
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий