Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 39
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я не знаю как это объяснить. Но однозначно тянет на шедевр.
Я же говорю тут по язвить любят )) А Тришкин еще обиделся на это ..Сказал .что будет код тут помогут ..
Я такой же новичок как и ты но даже у меня возникает куча вопросов
for (int i=0; i<OrdersTotal(); i++){
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
if (OrderType()==OP_BUYSTOP)
if (сигнал_bue) OrderDelete(OrderTicket());
else b++;
if (OrderType()==OP_SELLSTOP)
if (сигнал_sell) OrderDelete(OrderTicket());
else s++;
}
}
1) откуда ты взял b++
2) откуда ты взял s++
3) if (сигнал_bue) это еще что?
ну и по остальному коду. Извини если обидел.
//| ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss = 100; //Стоплосс ордера
extern double TakeProfit = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int Delta = 100; //Расстояние от цены для установки ордера
extern double LOT = 0.1; //Объём позиции
extern int Magic =2;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (TrailingStop!=0) Trailing();
//ИНДИКАТОР RSI
double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
int b = 0, s = 0, p = 0, res = 0;
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
if (OrderType()==OP_BUYSTOP)
{
if(RSI0<50&&RSI1>50)
OrderDelete(OrderTicket());
else
b++;
}
if (OrderType()==OP_SELLSTOP)
{
if(RSI0>50&&RSI1<50)
OrderDelete(OrderTicket());
else
s++;
}
}
}
double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить
//---- buy stop
if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
}
//---- sell stop
if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
}
//----
return(0);
}
Я же говорю тут по язвить любят )) А Тришкин еще обиделся на это ..Сказал .что будет код тут помогут ..
Так попроще:
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
OrderDelete(OrderTicket());
}
}
}
Это где нибуть за пределами функции void OnTick()
if (сигнал_sell)OrderDelete_(OP_BUYSTOP);
А это в теле функции void OnTick()
А это в теле функции void OnTick()
Ок.
Вроде как добил что мог. Описание сделал. Цель - понять почему он не работает так как хочется.
Там else ВНУТРИ блока if(). Неужели так и задумывалось???
Далее. В функцию Counts() передаётся неинициализированная глобальная переменная count, которая к тому же объявлена ещё раз в самой функции.
Функция Counts() пересчитывает ордера, но сравнивает их с каким-то тикетом, который в главной функции аж несколько раз меняется. Но значение тикета-то одно во время срабатывания функции. Так сколько ордеров насчитает функция? Неужели больше одного?
Эта функция в таком виде не нуждается в аргументах, просто вызывайте её и пусть возвращает результат.
Далее. Функция FindLastOType() - опять сравнение с тикетом. Вы можете гарантировать, что там с правильным тикетом сравнивается? Не проще ли прервать цикл, когда найден первый ордер с нужным магиком и символом, а затем вернуть тип ордера?
То же самое с FindLastOrderOpenPrice() и FindLastLot().
Функция ModifyOrders() меня ужаснула настолько, что я долго в неё смотреть не стал, чтобы ночью спать без кошмаров...
Пожалуйста в коде сделайте исправления
Пробуй ^_~
extern double TakeProfit = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int Delta = 100; //Расстояние от цены для установки ордера
extern double LOT = 0.1; //Объём позиции
extern int Magic =2;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int res = 0;
//ИНДИКАТОР RSI
double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
//---- buy stop
if(RSI0>50&&RSI1<50 && Number(OP_BUYSTOP)<0 && Number(OP_BUY)<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
}
//---- sell stop
if(RSI0<50&&RSI1>50 && Number(OP_SELLSTOP)<0 && Number(OP_SELL)<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
}
//----
if (RSI0>50&&RSI1<50) OrderDelete_(OP_SELLSTOP);
if (RSI0<50&&RSI1>50)OrderDelete_(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
void OrderDelete_(int Type)
{
bool r;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
r = OrderDelete(OrderTicket());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number(int Type)
{
int kp=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
kp++;
}
}
return(kp);
}
//+------------------------------------------------------------------+
Там else ВНУТРИ блока if(). Неужели так и задумывалось???
Далее. В функцию Counts() передаётся неинициализированная глобальная переменная count, которая к тому же объявлена ещё раз в самой функции.
Функция Counts() пересчитывает ордера, но сравнивает их с каким-то тикетом, который в главной функции аж несколько раз меняется. Но значение тикета-то одно во время срабатывания функции. Так сколько ордеров насчитает функция? Неужели больше одного?
Эта функция в таком виде не нуждается в аргументах, просто вызывайте её и пусть возвращает результат.
Далее. Функция FindLastOType() - опять сравнение с тикетом. Вы можете гарантировать, что там с правильным тикетом сравнивается? Не проще ли прервать цикл, когда найден первый ордер с нужным магиком и символом, а затем вернуть тип ордера?
То же самое с FindLastOrderOpenPrice() и FindLastLot().
Функция ModifyOrders() меня ужаснула настолько, что я долго в неё смотреть не стал, чтобы ночью спать без кошмаров...
Поправлю
ее по-другому вообще никуда не засунуть, будет wrong parameters
Должна учитывать самый последний
я попробую поменять
Насчет последней, ну да) я пробовал обойтись стандартной OrderModify() но счет банят если кучу ордеров одновременно и постоянно двигать
Спасибо за критику.
Да, со скобкой опечатался. В остальном вопрос актуален.
bool condition;
if(condition) {}
равносильно
if(condition==true) {}
и
if(!condition) {}
равносильно
if(condition==false) {}
Просто запись короче и привычнее.