I ask for help in finding the error. 1. The second tool does not always open.
2. Sometimes the pair closes at more than one time.
3. Sometimes lots do not match.
I get the tools by cloning the original Ami tools.
OptimizerSetEngine("cmae");
//Мудуль МА для расчета отклоненния от спреда и вычисления тренда
P_MA = Optimize("P_MA", 10, 10, 300, 10);
//Мудуль коэффициента веса
beta = Optimize("beta", 6, 1, 10, 1);
lot1 = 2;//Optimize("lot1", 1, 1, 10, 1);
lot2 = 20;//Optimize("lot2", 1, 10, 60, 10);
//Мудуль отступа
b1 = 0.001;//Optimize("b1", 0.002, 0.001, 0.002, 0.001);
b2 = 0.001;//Optimize("b2", 0.001, 0.001, 0.002, 0.001);
//Модуль увеличения лота по времени
H3 = Optimize("H3", 21, 10, 23, 1);
M3 = 00;//Optimize("M3", 25, 0, 45, 15);
//Мудуль фильтра по двум MA
P_MA11 = Optimize("P_MA11", 190, 5, 190, 10);
P_MA12 = 200;//Optimize("P_MA12", 920, 100, 200, 10);
P_MA21 = Optimize("P_MA21", 490, 100, 490, 10);
P_MA22 = 1000;//Optimize("P_MA22", 920, 500, 1000, 10);
P_MA31 = Optimize("P_MA31", 550, 500, 990, 10);
P_MA32 = 1000;//Optimize("P_MA32", 920, 500, 1000, 10);
//Константа минимального объема инструмента в рынке
Vmin = 5;
//Модуль значимости тренда
K1 = Optimize("K1", 90, 10, 100, 10);
K2 = Optimize("K2", 70, 10, 100, 10);
Ticker_name1 = "GAZR";
Ticker_name2 = "MXI";
SetForeign(Ticker_name1 + "1");
Ticker1_C = Close;
Ticker1_H = High;
Ticker1_L = Low;
Ticker1 = (Ticker1_H + Ticker1_L)/2;
Ticker1_V = Volume;
RestorePriceArrays();
SetForeign(Ticker_name2 + "1");
Ticker2_C = Close;
Ticker2_H = High;
Ticker2_L = Low;
Ticker2 = (Ticker2_H + Ticker2_L)/2;
Ticker2_V = Volume;
RestorePriceArrays();
Spread = Ticker1 - betaTicker2;
Spread_C = Ticker1_C - betaTicker2_C;
Spread_H = Ticker1_H - betaTicker2_H;
Spread_L = Ticker1_L - betaTicker2_L;
emaSpread = EMA(Spread, P_MA);
//Модуль расчета ТРЕНДА
AT1 = EMA(Spread, P_MA11) - EMA(Spread, P_MA12);
AT2 = EMA(Spread, P_MA21) - EMA(Spread, P_MA22);
AT3 = EMA(Spread, P_MA31) - EMA(Spread, P_MA32);
Open_UP = Close_UP = Open_DOWN = Close_DOWN = False;
switch (StrToNum(StrRight(Name(), 1)))
{
case 1:
{
Open_UP1 = Spread_H > emaSpread + Ticker1_Cb1 AND Spread_H > emaSpread + Ticker1_Cb1 + AT1K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Close_UP1 = Spread_L < emaSpread - Ticker1_Cb2 AND Spread_L < emaSpread - Ticker1_Cb1 + AT1K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Open_DOWN1 = Spread_L < emaSpread - Ticker1_Cb1 AND Spread_L < emaSpread - Ticker1_Cb1 + AT1K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Close_DOWN1 = Spread_H > emaSpread + Ticker1_Cb2 AND Spread_H > emaSpread + Ticker1_Cb2 + AT1K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
} break;
case 2:
{
Open_UP2 = Spread_H > emaSpread + Ticker1_C*b1 AND Spread_H > emaSpread + Ticker1_C*b1 + AT2*K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Close_UP2 = Spread_L < emaSpread - Ticker1_C*b2 AND Spread_L < emaSpread - Ticker1_C*b1 + AT2*K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Open_DOWN2 = Spread_L < emaSpread - Ticker1_C*b1 AND Spread_L < emaSpread - Ticker1_C*b1 + AT2*K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Close_DOWN2 = Spread_H > emaSpread + Ticker1_C*b2 AND Spread_H > emaSpread + Ticker1_C*b2 + AT2*K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
} break;
case 3:
{
Open_UP3 = Spread_H > emaSpread + Ticker1_C*b1 AND Spread_H > emaSpread + Ticker1_C*b1 + AT3*K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Close_UP3 = Spread_L < emaSpread - Ticker1_C*b2 AND Spread_L < emaSpread - Ticker1_C*b1 + AT3*K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Open_DOWN3 = Spread_L < emaSpread - Ticker1_C*b1 AND Spread_L < emaSpread - Ticker1_C*b1 + AT3*K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Close_DOWN3 = Spread_H > emaSpread + Ticker1_C*b2 AND Spread_H > emaSpread + Ticker1_C*b2 + AT3*K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
} break;
case 4:
{
Open_UP4 = Spread_H > emaSpread + Ticker1_C*b1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Close_UP4 = Spread_L < emaSpread - Ticker1_C*b2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Open_DOWN4 = Spread_L < emaSpread - Ticker1_C*b1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Close_DOWN4 = Spread_H > emaSpread + Ticker1_C*b2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
} break;
case 5:
{
Open_UP5 = Spread_H > emaSpread + Ticker1_C*b1 AND Spread_H > emaSpread + Ticker1_C*b1 + AT1*K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin AND TimeNum() > H3*10000 + M3*100;
Close_UP5 = Spread_L < emaSpread - Ticker1_C*b2 AND Spread_L < emaSpread - Ticker1_C*b1 + AT1*K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Open_DOWN5 = Spread_L < emaSpread - Ticker1_C*b1 AND Spread_L < emaSpread - Ticker1_C*b1 + AT1*K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin AND TimeNum() > H3*10000 + M3*100;
Close_DOWN5 = Spread_H > emaSpread + Ticker1_C*b2 AND Spread_H > emaSpread + Ticker1_C*b2 + AT1*K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
} break;
case 6:
{
Open_UP6 = Spread_H > emaSpread + Ticker1_C*b1 AND Spread_H > emaSpread + Ticker1_C*b1 + AT2*K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin AND TimeNum() > H3*10000 + M3*100;
Close_UP6 = Spread_L < emaSpread - Ticker1_C*b2 AND Spread_L < emaSpread - Ticker1_C*b1 + AT2*K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Open_DOWN6 = Spread_L < emaSpread - Ticker1_C*b1 AND Spread_L < emaSpread - Ticker1_C*b1 + AT2*K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin AND TimeNum() > H3*10000 + M3*100;
Close_DOWN6 = Spread_H > emaSpread + Ticker1_C*b2 AND Spread_H > emaSpread + Ticker1_C*b2 + AT2*K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
} break;
case 7:
{
Open_UP7 = Spread_H > emaSpread + Ticker1_C*b1 AND Spread_H > emaSpread + Ticker1_C*b1 + AT3*K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin AND TimeNum() > H3*10000 + M3*100;
Close_UP7 = Spread_L < emaSpread - Ticker1_C*b2 AND Spread_L < emaSpread - Ticker1_C*b1 + AT3*K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Open_DOWN7 = Spread_L < emaSpread - Ticker1_C*b1 AND Spread_L < emaSpread - Ticker1_C*b1 + AT3*K1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin AND TimeNum() > H3*10000 + M3*100;
Close_DOWN7 = Spread_H > emaSpread + Ticker1_C*b2 AND Spread_H > emaSpread + Ticker1_C*b2 + AT3*K2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
} break;
case 8:
{
Open_UP8 = Spread_H > emaSpread + Ticker1_C*b1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin AND TimeNum() > H3*10000 + M3*100;
Close_UP8 = Spread_L < emaSpread - Ticker1_C*b2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
Open_DOWN8 = Spread_L < emaSpread - Ticker1_C*b1 AND Ticker1_V > Vmin AND Ticker2_V > Vmin AND TimeNum() > H3*10000 + M3*100;
Close_DOWN8 = Spread_H > emaSpread + Ticker1_C*b2 AND Ticker1_V > Vmin AND Ticker2_V > Vmin;
} break;
}
if (Name() == Ticker_name1 + "1") {Buy = Open_DOWN1; Sell = Close_DOWN1; Short = Open_UP1; Cover = Close_UP1; SetPositionSize(lot1, spsShares);}
if (Name() == Ticker_name2 + "1") {Buy = Open_UP1; Sell = Close_UP1; Short = Open_DOWN1; Cover = Close_DOWN1; SetPositionSize(lot2, spsShares);}
if (Name() == Ticker_name1 + "2") {Buy = Open_DOWN2; Sell = Close_DOWN2; Short = Open_UP2; Cover = Close_UP2; SetPositionSize(lot1, spsShares);}
if (Name() == Ticker_name2 + "2") {Buy = Open_UP2; Sell = Close_UP2; Short = Open_DOWN2; Cover = Close_DOWN2; SetPositionSize(lot2, spsShares);}
if (Name() == Ticker_name1 + "3") {Buy = Open_DOWN3; Sell = Close_DOWN3; Short = Open_UP3; Cover = Close_UP3; SetPositionSize(lot1, spsShares);}
if (Name() == Ticker_name2 + "3") {Buy = Open_UP3; Sell = Close_UP3; Short = Open_DOWN3; Cover = Close_DOWN3; SetPositionSize(lot2, spsShares);}
if (Name() == Ticker_name1 + "4") {Buy = Open_DOWN4; Sell = Close_DOWN4; Short = Open_UP4; Cover = Close_UP4; SetPositionSize(lot1, spsShares);}
if (Name() == Ticker_name2 + "4") {Buy = Open_UP4; Sell = Close_UP4; Short = Open_DOWN4; Cover = Close_DOWN4; SetPositionSize(lot2, spsShares);}
if (Name() == Ticker_name1 + "5") {Buy = Open_DOWN5; Sell = Close_DOWN5; Short = Open_UP5; Cover = Close_UP5; SetPositionSize(lot1, spsShares);}
if (Name() == Ticker_name2 + "5") {Buy = Open_UP5; Sell = Close_UP5; Short = Open_DOWN5; Cover = Close_DOWN5; SetPositionSize(lot2, spsShares);}
if (Name() == Ticker_name1 + "6") {Buy = Open_DOWN6; Sell = Close_DOWN6; Short = Open_UP6; Cover = Close_UP6; SetPositionSize(lot1, spsShares);}
if (Name() == Ticker_name2 + "6") {Buy = Open_UP6; Sell = Close_UP6; Short = Open_DOWN6; Cover = Close_DOWN6; SetPositionSize(lot2, spsShares);}
if (Name() == Ticker_name1 + "7") {Buy = Open_DOWN7; Sell = Close_DOWN7; Short = Open_UP7; Cover = Close_UP7; SetPositionSize(lot1, spsShares);}
if (Name() == Ticker_name2 + "7") {Buy = Open_UP7; Sell = Close_UP7; Short = Open_DOWN7; Cover = Close_DOWN7; SetPositionSize(lot2, spsShares);}
if (Name() == Ticker_name1 + "8") {Buy = Open_DOWN8; Sell = Close_DOWN8; Short = Open_UP8; Cover = Close_UP8; SetPositionSize(lot1, spsShares);}
if (Name() == Ticker_name2 + "8") {Buy = Open_UP8; Sell = Close_UP8; Short = Open_DOWN8; Cover = Close_DOWN8; SetPositionSize(lot2, spsShares);}
Buy = ExRem(Buy, Sell); Sell = ExRem(Sell, Buy); Short = ExRem(Short, Cover); Cover = ExRem(Cover, Short);