zscore diff 3 pairs ea_011.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.