Помогите разобраться с кодом!!!!

 

Решил попытаться выучить MQL так что пожалуйста строго не судите!

ПодскажитПодскажите что здесь не правильно пожалста!

И как сюда вписать функцию что-бы он при движении цены в противоположном направлении (на пример при последнем ордере на покупку) открывал через Х пунктов ордер на продажу??? И Наоборот если последний ордер на продажу открывал ордер на покупку???е где я тут наделал ошибок?


На данный момент выдаёт ошибку:

2008.12.24 17:50:27 2008.10.24 19:01 Kanal EURUSD,M1: OrderSend error 4051
2008.12.24 17:50:27 2008.10.24 19:01 Kanal EURUSD,M1: invalid lots amount for OrderSend function



//+------------------------------------------------------------------+
//| Kanal.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
extern double step=25; //Шаг между ордерами
extern double proffactor=10; //Фиксация прибыли
extern double mult=1.5; //Увеличение лота в следующем ордере
extern double lotsbuy=0.01; //Размер лота в первом ордере
extern double lotssell=0.01;
extern double Magicbuy=555;
extern double Magicsell=556;
double openpricebuy,openpricesell,lotsbuy2,lotssell2,lastlotbuy,lastlotsell,tpb,tps,cnt,slbuy,slsell,smbuy,smsell,lotstep,
maxLot,free,balance,lotsell,lotbuy,dig,sig_buy,sig_sell,ask,bid;
//+------------------------------------------------------------------+
//| функция выдает текущее число ордеров на покупку |
//+------------------------------------------------------------------+
int ticketbuy,ticketsell,ticket;

int OrdersTotalMagicbuy(int Magicbuy)

{
int j=0;
int r;
for (r=0;r<OrdersTotal();r++)
{
if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES))
{
if (OrderMagicNumber()==Magicbuy) j++;
}
}
return(j);
}
//+------------------------------------------------------------------+
//| функция выдает текущее число ордеров на продажу |
//+------------------------------------------------------------------+
int OrdersTotalMagicsell(int Magicsell)

{
int d=0;
int n;
for (n=0;n<OrdersTotal();n++)
{
if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES))
{
if (OrderMagicNumber()==Magicsell) d++;
}
}
return(d);
}
//+------------------------------------------------------------------+
//| функция закрытия ордера на покупку |
//+------------------------------------------------------------------+

int orderclosebuy(int ticketbuy)

{
string symbol = Symbol();
double dig2=MarketInfo(symbol,MODE_DIGITS);
int cnt;
for(cnt = OrdersTotal(); cnt >= 0; cnt--)//почему с конца отсчет?
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == symbol && OrderMagicNumber()==Magicbuy)
{
ticketbuy=OrderTicket();OrderSelect(ticketbuy, SELECT_BY_TICKET, MODE_TRADES);lotsbuy2=OrderLots();//непонятно, какой критерий для закрытия. все подряд?
double bid = MarketInfo(symbol,MODE_BID);
RefreshRates();
OrderClose(ticketbuy,lotsbuy2,NormalizeDouble(bid,dig2),3,Magenta);
}
}
lotsbuy2=lotsbuy;return(0);
}
//+------------------------------------------------------------------+
//| Функция закрытия ордера на продажу |
//+------------------------------------------------------------------+

int orderclosesell(int ticketsell)

{
string symbol = Symbol();
double dig2=MarketInfo(symbol,MODE_DIGITS);
int cnt;
for(cnt = OrdersTotal(); cnt >= 0; cnt--)//опять отсчет с конца списка
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == symbol && OrderMagicNumber()==Magicsell)
{
ticketsell=OrderTicket();OrderSelect(ticketsell, SELECT_BY_TICKET, MODE_TRADES);lotssell2=OrderLots() ;
double ask = MarketInfo(symbol,MODE_ASK);
RefreshRates();
OrderClose(ticketsell,lotssell2,NormalizeDouble(ask,dig2),3, Lime);
}
}
lotssell2=lotssell;return(0);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double lot2;
lot2=OrderLots()*mult*OrdersTotal()-1;
double profitbuy=0;double profitsell=0;double profit=0;
double openprice=0;
string symbol = OrderSymbol();
double spread = MarketInfo(symbol,MODE_SPREAD);
double dig2 = MarketInfo(symbol,MODE_DIGITS);
double minLot = MarketInfo(symbol,MODE_MINLOT);
if (minLot==0.01){dig=2;maxLot=MarketInfo(symbol,MODE_MAXLOT);}
if (minLot==0.1){dig=1;maxLot=((AccountBalance()/2)/1000);}

if(OrdersTotal()<1)
//если ордеров нет
{
ticketbuy = OrderSend(Symbol(),OP_BUY,lotsbuy,Ask,3,0,0,"Grail",Magicbuy,0,Blue);
Print("начальная покупка");
//покупаем!!!
}


//обходим все покупные ордера - считаем профит!
for (cnt=0;cnt<OrdersTotal();cnt++)
{
Print("обход покупных ордеров, cnt=",cnt);
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderMagicNumber () == Magicbuy)
{
ticketbuy = OrderTicket();OrderSelect(ticketbuy,SELECT_BY_TICKET, MODE_TRADES);
profitbuy = profitbuy+OrderProfit();
openpricebuy = OrderOpenPrice();
}
}
tpb = (OrdersTotalMagicbuy(Magicbuy)*proffactor*Point)+openpricebuy;
Print("tpb=",tpb);

//обходим все продажные ордера - считаем профит!
for (cnt=0;cnt<OrdersTotal();cnt++)
{
Print("обход продажных ордеров, cnt=",cnt);
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magicsell)
{
ticketsell = OrderTicket();OrderSelect(ticketsell,SELECT_BY_TICKET, MODE_TRADES);profitsell = profitsell+OrderProfit();
openpricesell = OrderOpenPrice();
}
}
tps = openpricesell-(OrdersTotalMagicsell(Magicsell)*proffactor*Point);
Print("tps=",tps);

if (profitsell+profitbuy>=proffactor)
{
orderclosesell(ticketsell);
orderclosebuy(ticketbuy);
Print("profit=",profitsell+profitbuy);
//закрываем все
}
else
{
Print("плохой профит");
if (OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
openprice=OrderOpenPrice();
if (OrderType()==OP_BUY)
{
Print("открываем продажу ",OrderMagicNumber ());
ticketsell=OrderSend(Symbol(),OP_SELL,lot2,Bid,3,0,0,"Kanal",Magicsell,0,Red);
}
if (OrderType()==OP_SELL)
{
Print("открываем покупку ",OrderMagicNumber ());
ticketbuy=OrderSend(Symbol(),OP_BUY,lot2,Ask,3,0,0,"Kanal",Magicbuy,0,Blue);
}
}

free = AccountFreeMargin();balance = AccountBalance();
for (cnt=0;cnt< OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol()==Symbol() && OrderMagicNumber () == Magicbuy) ticketbuy = OrderTicket();
if (OrderSymbol()==Symbol() && OrderMagicNumber () == Magicsell) ticketsell = OrderTicket();
}
if (OrdersTotalMagicbuy(Magicbuy)==0)
{
profitbuy=0;ticketbuy=0;tpb=0;
}
if (OrdersTotalMagicsell(Magicsell)==0)
{
profitsell=0;ticketsell=0;tps=0;
}

return(0);
}
Причина обращения: