Здравствуйте! Помогите пожалуйста, найти ошибку по уроку где показывают как писать мартенгейл. Компелируеться без ошибок и предупреждению.
Сам пересмотрел урок уже дважды и в голове все плывет.
Какие бы параметры не выставлял, выдает плюс- минус одно и тоже. Как на скриншоте, совсем ни как на уроке.
Может у кого то, есть свой код с урока
//+------------------------------------------------------------------+
//| 4.1.mq4 |
//| советники на мартингейле. j |
//| https://www |
//+------------------------------------------------------------------+
#property copyright "j"
#property link "https://www"
#property version "1.00"
#property strict
extern double Lots = 0.01;
extern int TakeProfit = 50;
extern int Step = 60;
extern double multipler = 2;
extern int Magic = 123;
extern int maPeriod = 14;
extern int ma_shift = 0;
extern int ma_method = 1;
extern int ma_price = 0;
int ticket;
double tp, price, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if( Digits == 3 || Digits == 5)
TakeProfit *=10;
Step *=10;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double ima_1 = iMA(Symbol(), NULL, maPeriod, ma_shift, ma_method, ma_price, 0);
if(CountTrades()==0)
{
if(Ask > ima_1)
{
tp=NormalizeDouble(Ask + TakeProfit *Point, Digits);
ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 10, 0, tp, "", Magic, 0, Blue);
}
else
{
tp=NormalizeDouble(Bid - TakeProfit *Point, Digits);
ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 10, 0, tp, "", Magic, 0, Red);
}
}
else
{
int order_type = FindLastOrderType();
if(order_type==OP_BUY)
{
price = FindLastOrderPrice(OP_BUY);
if(Ask <= price-Step *_Point)
{
lastlot=FindLastLots(OP_BUY);
lastlot= NormalizeDouble(lastlot *multipler, 2);
ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, 10, 0, 0, "", Magic, 0, Blue); //TakeProfit пока 0, так как его еще надо будет модифицировать с учетом всех открытых ордеров
if(ticket < 1)
Print("Ошибка открития ордера на покупку");
ModifyOrders(OP_BUY);
}
}
if(order_type==OP_SELL)
{
price = FindLastOrderPrice(OP_SELL);
if(Bid >= price + Step *Point)
{
lastlot=FindLastLots(OP_SELL);
lastlot= NormalizeDouble(lastlot * multipler, 2);
ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, 10, 0, 0, "", Magic, 0, Red);
if(ticket < 1)
Print("Ошибка открытие ордера на продажу");
ModifyOrders(OP_SELL);
}
}
}
} // OnTick()
//-------------------------------------------------------------1) считаем ордера в рынке
int CountTrades()
{
int count = 0;
for(int i= OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if(OrderType() == OP_BUY || OrderType() == OP_SELL )
count++;
}
}
return(count);
}
//---------------------------------------------------------------2) Находим тип последнего ордера, BUY или SELL
int FindLastOrderType()
{
for(int i= OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()== OrderSymbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}
//----------------------------------------------------------3) Находим цену последнего ордера
double FindLastOrderPrice(int otype)
{
int oldticket;
double oldopenprice = 0;
ticket = 0;
for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
{
if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()== Symbol() && OrderMagicNumber() == Magic && OrderType()== otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldopenprice = OrderOpenPrice();
}}}}
return(oldopenprice);
}
//--------------------------------------------------4) Находим сколько пунктов прошел последний закрытый ордер
double FindLastOrderProfit(int otype)
{
int oldticket;
double oldorderProfit = 0;
int bticket = 0;
for(int cnt=OrdersTotal(); cnt>=0; cnt--)
{
if(OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol()== Symbol() && OrderMagicNumber() == Magic && OrderType()== otype)
{
oldticket = OrderTicket();
if(oldticket > bticket)
{
bticket = oldticket;
oldorderProfit = OrderProfit();
}}}}
return(oldorderProfit);
}
//--------------------------------------------------5) Наход объем лота последнего открытого ордера
double FindLastLots(int otype)
{
int oldticket;
double oldlots = 0;
ticket = 0;
for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
{
if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()== OrderSymbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
ticket = oldticket;
oldlots = OrderLots();
}}}}
return(oldlots);
}
//----------------------------------------------6) Модифиция TakeProfit
void ModifyOrders(int otipe)
{
double avg_price, order_lots=0;
price = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()== Symbol() && OrderMagicNumber()==Magic && OrderType()==otipe)
{
price += OrderOpenPrice() *OrderLots();
order_lots += OrderLots();
}
}
}
avg_price = NormalizeDouble(price / order_lots, Digits);
if(otipe == OP_BUY) tp = NormalizeDouble(avg_price + TakeProfit, Digits);
if(otipe == OP_SELL) tp = NormalizeDouble(avg_price - TakeProfit, Digits);
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==otipe)
{
if(OrderModify( OrderTicket(), OrderOpenPrice(), 0, tp, 0))
Print("ордера успешно модифицированы");
else Print("ошибка модификации ордеров");
}
}
}
}//void ModifyOrders
//---------------------------------------------------------------
