Пропустил, а как же.
Если в качестве параметров функции передать неизмененные значения, то в этом случае будет сгенерирована ошибка 1 (ERR_NO_RESULT).
В частности, тут передаётся параметр SL=0 (а в ордере он и так 0), а надо бы OrderStopLoss(), также экспирация, лучше передавать OrderExpiration().
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вроде все по уроку делал, может что пропустил?
//+------------------------------------------------------------------+
//| martin.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
extern double Lots = 0.1;
extern int TakeProfit = 30;
extern int Step = 50;
extern double Multipler = 2;
extern int Magic = 123;
//extern int tframe = 60;
extern int period = 14;
extern int Slippage = 3;
double tp, price, lastlot;
int ticket ;
//+------------------------------------------------------------------+
//| 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 = iMA(Symbol(), 0, period, 0, MODE_SMA, PRICE_CLOSE, 0);
if (CountTrades() == 0)
if (Ask > ima)
{
tp = NormalizeDouble(Ask + TakeProfit*Point, Digits);
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, tp, "", Magic, 0, Blue);
}
else
{
tp = NormalizeDouble(Bid - TakeProfit*Point, Digits);
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 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, Slippage, 0, 0, "", Magic, 0, Blue);
if (ticket < 1)
Print("Ошибка открытия ордера на покупку");
ModifyOrders(OP_BUY);
}
}
if(order_type == OP_SELL)
{
price = FindLastOrderPrice(OP_BUY);
if(Bid >= price + Step*Point)
{
lastlot = FindLastLots(OP_SELL);
lastlot = NormalizeDouble(lastlot * Multipler, 2);
ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, 0, "", Magic, 0, Red);
if (ticket < 1)
Print("Ошибка открытия ордера на продажу");
ModifyOrders(OP_SELL);
}
}
}
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
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() == otype)
{
price += OrderOpenPrice() * OrderLots();
order_lots += OrderLots();
}
}
}
avg_price = NormalizeDouble(price / order_lots, Digits);
if (otype == OP_BUY) tp = NormalizeDouble(avg_price + TakeProfit*Point, Digits);
if (otype == OP_SELL) tp = NormalizeDouble(avg_price - TakeProfit*Point, Digits);
for (int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
Print("Ордера успешно модифицированны");
else Print("Ошибка модификации ордеров");
}
}
}
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
int oldticket=0;
double oldlots=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;
oldlots = OrderLots();
}
}
}
return(oldlots);
}
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}
//+--------------------------------------------------------------------=
double FindLastOrderPrice(int otype)
{
int oldticket=0;
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);
}
//+--------------------------------------------------------+