Здравствуйте дорогие друзья!
Пытаюсь сам разобраться в коде, но наткнулся на одну ошибку (точнее несколько).
Пытаюсь совместить советник на РСИ (открытие ордеров за зонами перекупленности\перепроданности)
и обычного гридера ордеров с шагом выставления.
Кому интересно помочь, буду рад обсуждению и помощи в разборе кода.
Так как тут много кто разбирается в коде.
Вот сам код:
//+------------------------------------------------------------------+
//| Global robbery |
//| Copyright 2019, CompanyName |
//| http://www.companyname.net |
//+------------------------------------------------------------------+
/*
*/
//+------------------------------------------------------------------+
//| Rsi cracken |
//| |
//+------------------------------------------------------------------+
#property copyright "MaksGruv 2018-2019"
#property link "https://vk.com/cripto_invest_project"
#property version "3.10"
#property strict
extern double Lot = 0.01; // Лот
extern int Takeprofit = 30; // Тейкпрофит
extern int Step = 40; // Шаг между ордерами
extern int Slippage = 3; // Проскальзывание
extern int Magic = 9999; // Магический номер
extern int period_RSI = 14; // Период РСИ для переменной
extern int buy_level = 30; // Уровень
extern int sell_level = 70; // Уровень
extern double KStep = 2; // увеличение шага
extern string comment = "MaksGruv";
int ticket, otype, shift;
double rsi, TP, slip;
//........................................................................
// |
//........................................................................
int init()
{
if (Digits == 3 || Digits == 5) // 5-ти Знак для брокера
{
Takeprofit *= 10;
Step *= 10;
}
return(0);
}
//........................................................................
// |
//........................................................................
int deint()
{
return(0);
}
//........................................................................
// |
//........................................................................
void OnTick()
{ for (int i=0; i<OrdersTotal(); i++)
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())return;
double RSI0 = iRSI(NULL,0,period_RSI,PRICE_OPEN,0);
double RSI1 = iRSI(NULL,0,period_RSI,PRICE_OPEN,1);
if (RSI0 > buy_level && RSI1 < buy_level)
{
if (Takeprofit!=0) TP = NormalizeDouble(Ask + Takeprofit*Point,Digits);
if (OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),Slippage,0,TP,NULL,Magic)==-1) Print(GetLastError());
}
if (RSI0 < sell_level && RSI1 > sell_level)
{
if (Takeprofit!=0) TP = NormalizeDouble(Bid - Takeprofit*Point,Digits);
if (OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),Slippage,0,TP,NULL,Magic)==-1) Print(GetLastError());
}
return;
}
//...........................................................................................................................................
//...........................................................................................................................................
// |
//...........................................................................................................................................
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 FindOrderType()
{
int oticket,ticketNumber=0,type=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
oticket=OrderTicket();
if(oticket>ticketNumber)
{
ticketNumber=oticket;
type=OrderType();
}
}
}
}
return(type);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double FindLastBuyPrice()
{
int oticket,ticketNumber=0;
double oprice=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==Magic)
{
oticket=OrderTicket();
if(oticket>ticketNumber)
{
ticketNumber=oticket;
oprice=OrderOpenPrice();
}
}
}
}
return(oprice);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double FindLastSellPrice()
{
int oticket,ticketNumber=0;
double oprice=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==Magic)
{
oticket=OrderTicket();
if(oticket>ticketNumber)
{
ticketNumber=oticket;
oprice=OrderOpenPrice();
}
}
}
}
return(oprice);
}
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
{
double pr=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
pr+=OrderProfit()+OrderCommission()+OrderSwap();
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
pr+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
return(pr);
}
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
{
bool cl;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
}
}
}
}
}
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров |
//+------------------------------------------------------------------+
void DelOrder()
{
bool del;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()>1) del=OrderDelete(OrderTicket());
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Шаг для гридера |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
Комментарии (0)
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий