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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Stan
32
Stan  
Здaравствуйте у меня такой вопрос как можно соединить два советника? И заставить их работать одноврменно или переменно для примера тик первая тик вторая.
Павел
1002
Павел  
Оч просто -- код из одного перенести в другой.
Stan
32
Stan  
Надо в код влезат и интегрироват входные данные есть ли возможность объединить их на уровне скрипта?
Stan
32
Stan  
Надо в код влезат и интегрироват входные данные есть ли возможность объединить их на уровне скрипта?
Павел
1002
Павел  

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

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

Stan
32
Stan  
Можеш дать твой eмайл?
Валерий
1411
Валерий  

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

.........
// Список внешних переменных обоих экспертов
.........
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);
  }
Aleksandr Volotko
15140
Aleksandr Volotko  
Интересный вопрос и интересный метод реализации, спасибо Валерий. Надо обмозговать на досуге.
Aleksandr Volotko
15140
Aleksandr Volotko  

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

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

Валерий
1411
Валерий  

Эксперт по предложенной схеме работал у меня на 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;     
} 
// Описания используемых функций
.....
Aleksandr Volotko
15140
Aleksandr Volotko  
Спасибо, Валерий, большое! Буду разбираться теперь со своими на Вашем примере :)
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий