← К каталогу
Исходный код · ID 751

zscore diff 3 pairs ea_011.mq4

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Данный продукт представляет собой торгового советника для платформы MetaTrader 4, написанного на языке MQL4. Советник анализирует статистические отклонения ценовых данных трёх валютных пар, рассчитывая показатель Z-Score на основе скользящих средних и стандартных отклонений. На основе разницы Z-Score между парами принимается решение о входе в сделки.

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

Для исполнения ордеров используется библиотека OrderReliable, обеспечивающая надёжную отправку сделок. Поддерживается инвертирование направления торговых пар, что позволяет работать как с прямыми, так и с обратными котировками. Перед началом активной торговли советник ожидает возврата Z-Score в нормальный диапазон, задаваемый пользователем.

Настройки программы

НастройкаОписание
Verbose Включает или отключает подробный вывод информации в лог.
Period_ Период расчёта скользящей средней и стандартного отклонения для анализа ценовых данных.
Pair2 Символ второй торговой пары, используемой в расчётах.
Invert2 Переключатель инвертирования направления торговли второй парой.
Pair3 Символ третьей торговой пары, используемой в расчётах.
Invert3 Переключатель инвертирования направления торговли третьей парой.
lots Размер торгового лота для каждой сделки.
ResetLevel Уровень Z-Score, при достижении которого советник переходит к активной торговле после ожидания нормализации показателя.
CloseHighAtLevel Пороговое значение Z-Score для закрытия всех позиций при срабатывании верхнего уровня.
CloseLowAtLevel Пороговое значение Z-Score для закрытия всех позиций при срабатывании нижнего уровня.
note Справочное описание режимов тейк-профита: 1 — по корзине, 2 — по уровню.
TP_Mode Режим тейк-профита: 1 — по общей прибыли корзины, 2 — по прибыли каждого уровня отдельно.
dollars (TP) Значение тейк-профита в долларах (или другой валюте счёта).
Slippage Допустимое проскальзывание цены при исполнении ордеров.
Получить полный код

Поиск по коду файла

#property version   "2.10"

extern   bool     Verbose           = false;
#include <OrderReliable_120205.mqh>

extern   int      Period_           = 200;
extern   string   Pair2             = "GBPUSD";
extern   bool     Invert2           = false;
         string   DisplayPair2;

extern   string   Pair3             = "EURGBP";
extern   bool     Invert3           = false;
         string   DisplayPair3;

extern   double   lots              = 0.01;
extern   string   HighLevelValues   = "2.5;   3.5;   4.5;   99.0;   99.0";
extern   string   LowLevelValues    = "-2.5;  -3.5;  -4.5;  -99.0;  -99.0";

extern   double   ResetLevel        = 2.2;

extern   double   CloseHighAtLevel  = 0.5;
extern   double   CloseLowAtLevel   = -0.5;

extern   string   note              = " TP_Modes:: 1=TP by basket,  2=TP by level ";
extern   int      TP_Mode           = 1;
extern   double   TP                = 1.00;     // dollars

extern int       Slippage=2;  

         int      MAGICNUMBER;
         bool     BadSymbol         = false;
         bool     five;
         bool     StartTrading      = false;

double High_Level_Value[];
bool High_Level_Actived[];

double Low_Level_Value[];
bool Low_Level_Actived[];

int i, nHL, nLL, Instance,x;

string arr[];

string Current_Level="-";

         double   HighestZScore     = -999;
         double   LowestZScore      = 999;

         double   HighestProfit     = -999;
         double   LowestProfit      = 999;

double iDiff(){
   double s,desv_1,desv_2,desv_3,MA_1,MA_2,MA_3,c2,c3;
   int j;

   MA_1 = iMA(Symbol(),0,Period_,0,MODE_SMA,PRICE_CLOSE,0);
   MA_2 = iMA(Pair2,0,Period_,0,MODE_SMA,PRICE_CLOSE,0); 
   MA_3 = iMA(Pair3,0,Period_,0,MODE_SMA,PRICE_CLOSE,0); 

   if (Invert2) MA_2=1/MA_2;

   if (Invert3) MA_3=1/MA_3;

   s=0;
   for(j=0;j<Period_;j++){
      s+=MathPow(MA_1-Close[j],2);      
   }
   desv_1 = MathSqrt(s/(Period_-1));
   if(desv_1 == 0) desv_1 = 0.00001; // divide zero protection

   s=0;
   for(j=0;j<Period_;j++){

      c2=iClose(Pair2,0,j);
      if (Invert2) c2=1/c2;

      s+=MathPow(MA_2-c2,2);      
   }
   desv_2 = MathSqrt(s/(Period_-1)); 
   if(desv_2 == 0) desv_2 = 0.00001; // divide zero protection

   s=0;
   for(j=0;j<Period_;j++){

      c3=iClose(Pair3,0,j);     // original line was "c2=iClose(Pair3,0,j);"   bad bug
      if (Invert3) c3=1/c3;

      s+=MathPow(MA_3-c3,2);      
   }
   desv_3 = MathSqrt(s/(Period_-1)); 
   if(desv_3 == 0) desv_3 = 0.00001; // divide zero protection

   c2=iClose(Pair2,0,0);
   if (Invert2) c2=1/c2;

   c3=iClose(Pair3,0,0);
   if (Invert3) c3=1/c3;

   double Zscore1=(Close[0]-MA_1)/desv_1;     //Pair1
   double Zscore2=(c2-MA_2)/desv_2;           //Pair2
   double Zscore3=(c3-MA_3)/desv_3;           //Pair3

   return (  ((Zscore1-Zscore2) + (Zscore1-Zscore3))/2.0 );

}

double Lots(){
   return(lots);
}

int _Long(string pair, color cor, string comment){
   return ( OrderSendReliableMKT(pair,OP_BUY,Lots(),MarketInfo(pair,MODE_ASK),Slippage,0,0,comment,MAGICNUMBER,0,cor)   ); 
}

int _Short(string pair, color cor, string comment){
   return ( OrderSendReliableMKT(pair,OP_SELL,Lots(),MarketInfo(pair,MODE_BID),Slippage,0,0,comment,MAGICNUMBER,0,cor)   ); 
}

int Buy_And_Sell(string level, double zscore_diff=0){    //Buy first pair and Sell second pair

   /* 
   _Long(Symbol(),Green, level);    

   if (Invert2) _Long(Pair2,Green,level);
   else _Short(Pair2,Green,level);

   */

   _Long(Symbol(),Green, "L;" +level +";" + zscore_diff );   

   if (Invert2) _Long(Pair2,Green,"L;" +level +";" + zscore_diff);
   else _Short(Pair2,Green,"L;" +level +";" + zscore_diff); 

   if (Invert3) _Long(Pair3,Green,"L;" +level +";" + zscore_diff);
   else _Short(Pair3,Green,"L;" +level +";" + zscore_diff); 

   Current_Level="L"+level;

   return(0);
}

int Sell_And_Buy(string level, double zscore_diff=0){   //Sell first pair and Buy second pair
   /*
   _Short(Symbol(),Red,level);  

   if (Invert2) _Short(Pair2,Red ,level);
   else _Long(Pair2,Green ,level);
   */

   _Short(Symbol(),Red, "H;" +level +";" + zscore_diff);  

   if (Invert2) _Short(Pair2,Red ,"H;" +level +";" + zscore_diff);
   else _Long(Pair2,Red ,"H;" +level +";" + zscore_diff);

   if (Invert3) _Short(Pair3,Red ,"H;" +level +";" + zscore_diff);
   else _Long(Pair3,Red ,"H;" +level +";" + zscore_diff);

   Current_Level="H"+level;

   return(0);
}

double Profit_By_Level(string level=-1){
    double total_profit=0;
    bool found_orders = false;

        for (i=OrdersTotal()-1;i>=0;i--) {

            x=OrderSelect(i,SELECT_BY_POS);

            StringSplit(OrderComment(), StringGetCharacter(";",0) ,  arr );

            if  ( (OrderMagicNumber()==MAGICNUMBER ) &&  ( (arr[1]==IntegerToString(level ) ) ||  level==-1   ))  {
               total_profit+= ( OrderProfit() + OrderCommission() + OrderSwap() )  ;
               found_orders = true;
            }  

        }        
    if (!found_orders) {
      HighestProfit=-999;
      LowestProfit=999;
    }
    return(total_profit);

}

void CheckOrders(){
     Current_Level="-";

     int max_level=-1;

     for (i=OrdersTotal()-1;i>=0;i--) {

         x=OrderSelect(i,SELECT_BY_POS);

         if   (OrderMagicNumber()==MAGICNUMBER )   {
            StringSplit(OrderComment(), StringGetCharacter(";",0) ,  arr );
            if (StrToInteger(arr[1])>max_level) max_level=arr[1];
         }  

     }

     if (max_level>-1){
         for(i=0;i<=max_level;i++){
            if (arr[0]=="H" ) High_Level_Actived[i]=true;
            if (arr[0]=="L" ) Low_Level_Actived[i]=true;
         }
         Current_Level=arr[0]+max_level;

     }

}

int Close_All_Orders(int level=-1){

    while (OrdersTot

Показано первые 50% кода (символов: 8364)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
836,40₽ ≈ $10.22