Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Требуемые линии желтого цвета
Требуемые линии желтого цвета
Теперь расскажите, как тут получить профит... Или это нужно для построения игры?
Привет всем, помогите пожалуйста найти ошибку в коде советника, вроде всё просмотрел, в коде вроде написано всё правильно, но программа почему-то торгует некорректно! Идея такая: Советник должен искать две длинные свечи одного направления (длинна между свечей регулируется в советнике, то есть между двух минимумов или максимумов свечей в зависимости от направления), если цена в противоположную сторону пробивает минимум или максимум последней свечи, должна открываться сделка (Пример фото ситуаций на графике прикрепил в файле). Советник должен открывать сделки при каждой такой подходящей ситуации, а он почему-то открывает сделки только на торговых окнах между дней. Вот такая ситуация, кому не сложно из программеров, помогите пожалуйста, исправьте ошибку. Код советника смотрите ниже, а также в прикреплённом файле.
Привет всем, помогите пожалуйста найти ошибку в коде советника, вроде всё просмотрел, в коде вроде написано всё правильно, но программа почему-то торгует некорректно! Идея такая: Советник должен искать две длинные свечи одного направления (длинна между свечей регулируется в советнике, то есть между двух минимумов или максимумов свечей в зависимости от направления), если цена в противоположную сторону пробивает минимум или максимум последней свечи, должна открываться сделка (Пример фото ситуаций на графике прикрепил в файле). Советник должен открывать сделки при каждой такой подходящей ситуации, а он почему-то открывает сделки только на торговых окнах между дней. Вот такая ситуация, кому не сложно из программеров, помогите пожалуйста, исправьте ошибку. Код советника смотрите ниже, а также в прикреплённом файле.
Лучше сначала написать часть советника, чтоб отмечал на графике найденные свечи - все ясно станет. И следующие строчки в Вашем случае лишние:
Теперь расскажите, как тут получить профит... Или это нужно для построения игры?
Профита пока получить нет возможности. Есть алгоритм расчета двух вероятный ценовых целей, по ходу тренда, по пяти основным точкам, но он рассчитывается на специальном сервере с платной подпиской. Я хочу рассчитывать цели сам, работа над алгоритмом пока не окончена.
А как будет выглядеть Ваша программа в MQL4?
если у вас есть хороая стратегия, и вы готовы ей поделиться,могу написать советника. приглашаю обсудить или публично или в личные собщения.
Антон помоги разобраться, я добавил в советник функцию трэйлинг стопа, прокомпилировал, - выдаёт две ошибки. - Голову сломал, понять не могу как их исправить чтобы сова получилась. Правда сделки закрываются по условиям старой стратегии после касания ценой верхнейграницы канала, и нижней соответственно. Я так понимаю здесь тоже что-то нужно изменить. - Отзовись парням армии днр.
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//---------------------------------------------------------
extern double Lots = 0.01;
extern int TakeProfit = 600;
extern int StopLoss = 25;
extern int Magic = 0001;
extern int Slippage = 3;
extern int TralType = 0; // 0-SAR, 1-ATR, 2-HMA
extern double SAR_Step = 0.02;
extern double SAR_Max = 0.2;
extern int ATR_Period = 14;
extern double ATR_K = 2.0;
extern int HMA_Period = 16;
extern int HMA_Method = 3;
extern int HMA_Shift = 0;
datetime LBT;
//---------------------------------------------------------
extern string TMA = "Параметры индикатора TMA";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;
//---------------------------------------------------------
double PriceHigh, PriceLow, SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);
if(CountSell() == 0 && Bid >= PriceHigh)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);
if (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка модификации ордера на продажу!");
}
}
if (CountBuy() == 0 && Ask <= PriceLow)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
if (ticket > 0)
{
TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка модификации ордера на покупку!");
} else Print("Ошибка открытия ордера на покупку");
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//--------
//--------
return (0);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);
if(CountSell() == 0 && Bid >= PriceHigh)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);
if (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка модификации ордера на продажу!");
} else Print("Ошибка открытия ордера на продажу!");
}
if (CountBuy() == 0 && Ask <= PriceLow)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
if (ticket > 0)
{
TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка модификации ордера на покупку!");
} else Print("Ошибка открытия ордера на покупку");
}
if (Ask <= PriceLow && CountSell() > 0)
{
for (int i = OrdersTotal() -1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
Print("Ошибка закрытия ордера на продажу!");
}
}
}
if (Bid >= PriceHigh && CountBuy() > 0)
{
for (int i = OrdersTotal() -1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
Print("Ошибка закрытия ордера на покупку!");
}
}
}
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
count++;
}
}
return(count);
}//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//+-------
//+-------
return (0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int Start()
{
//-----
bool error = fals;
if (LBT!=Time[0]) {
if (OrdersTotal()!=0) {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderType()<2) {
double SL = OrderStopLoss();
if OrderType()==0) {
switch (TralType) {
case 0: SL = iSAR(NULL,0,SAR_Step,SAR_Max,0);
break;
case 1: SL = High[1] - iATR(NULL,0,ATR,Period,1)*ATR_K;
break;
case 2: SL = iCustom(NULL,0,"VininI_HMAsound&",HMA_Period,HMA_Method,3,HMA_Shift, fals,fals,"",1,0,0);
break;
}
if (SL<OrderStopLoss())
SL = OrderStopLoss();
}
if (OrderType()==1) {
switch (TralType) {
case 0: SL = iSAR(NULL,0,SAR_Step,SAR_Max,0);
break;
case 1: SL = Low[1] + iATR(NULL,0,ATR,Period,1)*ATR_K;
break;
case 2: SL = iCustom(NULL,0,"VininI_HMAsound&",HMA_Period,HMA_Method,3,HMA_Shift, fals,fals,"",1,0,0);
break;
}
if (SL>OrderStopLoss())
SL = OrderStopLoss();
}
if (SL!=OrderStopLoss()) {
if(!OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0))
error = true;
}
}
}
}
if (!error)
LBT = Time[0];
}
return (0);
}
//+------------------------------------------------------------------+
Для того чтобы набраться опыта в данной сфере, напишу 25 советников бесплатно под ваши интересные идеи и стратегии
Осталось 19 советников
Андрей помоги разобраться, я добавил в советник функцию трэйлинг стопа, прокомпилировал, - выдаёт две ошибки. - Голову сломал, понять не могу как их исправить чтобы сова получилась. Правда сделки закрываются по условиям старой стратегии после касания ценой верхнейграницы канала, и нижней соответственно. Я так понимаю здесь тоже что-то нужно изменить. - Отзовись парням армии днр.
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//---------------------------------------------------------
extern double Lots = 0.01;
extern int TakeProfit = 600;
extern int StopLoss = 25;
extern int Magic = 0001;
extern int Slippage = 3;
extern int TralType = 0; // 0-SAR, 1-ATR, 2-HMA
extern double SAR_Step = 0.02;
extern double SAR_Max = 0.2;
extern int ATR_Period = 14;
extern double ATR_K = 2.0;
extern int HMA_Period = 16;
extern int HMA_Method = 3;
extern int HMA_Shift = 0;
datetime LBT;
//---------------------------------------------------------
extern string TMA = "Параметры индикатора TMA";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;
//---------------------------------------------------------
double PriceHigh, PriceLow, SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);
if(CountSell() == 0 && Bid >= PriceHigh)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);
if (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка модификации ордера на продажу!");
}
}
if (CountBuy() == 0 && Ask <= PriceLow)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
if (ticket > 0)
{
TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка модификации ордера на покупку!");
} else Print("Ошибка открытия ордера на покупку");
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//--------
//--------
return (0);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);
if(CountSell() == 0 && Bid >= PriceHigh)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);
if (ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка модификации ордера на продажу!");
} else Print("Ошибка открытия ордера на продажу!");
}
if (CountBuy() == 0 && Ask <= PriceLow)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
if (ticket > 0)
{
TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Ошибка модификации ордера на покупку!");
} else Print("Ошибка открытия ордера на покупку");
}
if (Ask <= PriceLow && CountSell() > 0)
{
for (int i = OrdersTotal() -1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
Print("Ошибка закрытия ордера на продажу!");
}
}
}
if (Bid >= PriceHigh && CountBuy() > 0)
{
for (int i = OrdersTotal() -1; i>0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
Print("Ошибка закрытия ордера на покупку!");
}
}
}
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
count++;
}
}
return(count);
}//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//+-------
//+-------
return (0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int Start()
{
//-----
bool error = fals;
if (LBT!=Time[0]) {
if (OrdersTotal()!=0) {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderType()<2) {
double SL = OrderStopLoss();
if OrderType()==0) {
switch (TralType) {
case 0: SL = iSAR(NULL,0,SAR_Step,SAR_Max,0);
break;
case 1: SL = High[1] - iATR(NULL,0,ATR,Period,1)*ATR_K;
break;
case 2: SL = iCustom(NULL,0,"VininI_HMAsound&",HMA_Period,HMA_Method,3,HMA_Shift, fals,fals,"",1,0,0);
break;
}
if (SL<OrderStopLoss())
SL = OrderStopLoss();
}
if (OrderType()==1) {
switch (TralType) {
case 0: SL = iSAR(NULL,0,SAR_Step,SAR_Max,0);
break;
case 1: SL = Low[1] + iATR(NULL,0,ATR,Period,1)*ATR_K;
break;
case 2: SL = iCustom(NULL,0,"VininI_HMAsound&",HMA_Period,HMA_Method,3,HMA_Shift, fals,fals,"",1,0,0);
break;
}
if (SL>OrderStopLoss())
SL = OrderStopLoss();
}
if (SL!=OrderStopLoss()) {
if(!OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0))
error = true;
}
}
}
}
if (!error)
LBT = Time[0];
}
return (0);
}
//+------------------------------------------------------------------+
Андрей помоги разобраться, я добавил в советник функцию трэйлинг стопа, прокомпилировал, - выдаёт две ошибки. - Голову сломал, понять не могу как их исправить чтобы сова получилась. Правда сделки закрываются по условиям старой стратегии после касания ценой верхнейграницы канала, и нижней соответственно. Я так понимаю здесь тоже что-то нужно изменить. - Отзовись парням армии днр.
Не стоит спамить
Извиняюсь если что не так сделал. Правда так и не понял как я спамил... По-моему я два сообщения двум товарищам адресовал. Или так нельзя? - Виноват.