AZIK_REDKO:
вот
В принципе каких-то грубых ошибок, которые бы не дали возможность советнику работать, нет. Хотя, конечно, много, чего не учтено (проверок почти нет). Если немного подрихтовать код, чтобы видеть реальные ошибки, то код станет таким:
#property copyright "TO" extern int TYPE=0; extern int TP = 20; extern int SL = 50; extern double lot=0.01; // сумма ставки в $ extern int Magic_Number=639713; int init(){ return(0);} int deinit(){ return(0);} //=================================================================== //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double SPREAD=MarketInfo(Symbol(),MODE_SPREAD)*Point; double STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point; if(Orders_Total(Magic_Number,Symbol())==0) { //Установка ордеров if(TYPE<=0) { // Здесь установим STOP-ордера if(iHigh(Symbol(),PERIOD_D1,1)+SPREAD-STOPLEVEL>Ask) { int ticket = OrderSend(Symbol(),OP_BUYSTOP,lot,iHigh(Symbol(),PERIOD_D1,1)+SPREAD,3,iHigh(Symbol(),PERIOD_D1,1)-SL*Point,iHigh(Symbol(),PERIOD_D1,1)+TP*Point,NULL,Magic_Number,iTime(Symbol(),PERIOD_D1,0)+PERIOD_D1*60,Aqua); if (ticket < 0) Alert("Ошибка установки ордера Buy Stop: ", GetLastError()); // Сообщение об ошибке } else Alert("Невозможно установить OP_BUYSTOP, цена слишком близка или выше High"); if(iLow(Symbol(),PERIOD_D1,1)+STOPLEVEL<Bid) { ticket = OrderSend(Symbol(),OP_SELLSTOP,lot,iLow(Symbol(),PERIOD_D1,1),3,iLow(Symbol(),PERIOD_D1,1)+SPREAD+SL*Point,iLow(Symbol(),PERIOD_D1,1)+SPREAD-TP*Point,NULL,Magic_Number,iTime(Symbol(),PERIOD_D1,0)+PERIOD_D1*60,Magenta); if (ticket < 0) Alert("Ошибка установки ордера Sell Stop: ", GetLastError()); // Сообщение об ошибке } else Alert("Невозможно установить OP_SELLSTOP, цена слишком близка или ниже Low"); } if(TYPE>=1) { // Здесь установим LIMIT-ордера if(iHigh(Symbol(),PERIOD_D1,1)-STOPLEVEL>Bid) { ticket = OrderSend(Symbol(),OP_SELLLIMIT,lot,iHigh(Symbol(),PERIOD_D1,1),3,iHigh(Symbol(),PERIOD_D1,1)+SPREAD+SL*Point,iHigh(Symbol(),PERIOD_D1,1)+SPREAD-TP*Point,NULL,Magic_Number,iTime(Symbol(),PERIOD_D1,0)+PERIOD_D1*60,Magenta); if (ticket < 0) Alert("Ошибка установки ордера Sell Limit: ", GetLastError()); // Сообщение об ошибке } else Alert("Невозможно установить OP_SELLLIMIT, цена слишком близка или выше High"); if(iLow(Symbol(),PERIOD_D1,1)+STOPLEVEL<Ask) { ticket = OrderSend(Symbol(),OP_BUYLIMIT,lot,iLow(Symbol(),PERIOD_D1,1)+SPREAD,3,iLow(Symbol(),PERIOD_D1,1)-SL*Point,iLow(Symbol(),PERIOD_D1,1)+TP*Point,NULL,Magic_Number,iTime(Symbol(),PERIOD_D1,0)+PERIOD_D1*60,Aqua); if (ticket < 0) Alert("Ошибка установки ордера Buy Limit: ", GetLastError()); // Сообщение об ошибке } else Alert("Невозможно установить OP_BUYLIMIT, цена слишком близка или ниже Low"); } } return(0); } //---- Возвращает количество ордеров указанного эксперта(Маджик,Символ) ----// int Orders_Total(int mn,string sym) { int num_orders=0; for(int i=OrdersTotal()-1;i>=0;i--) { bool check = OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderMagicNumber()==mn && sym==OrderSymbol()) num_orders++; } return(num_orders); }; //+------------------------------------------------------------------+
Здесь тоже далеко до совершенства, но работать во многих случаях будет (у меня работает).
Просто смотрите, какие ошибки выдает эксперт.
You have to analyze the result to see if the action was successful or not.
//+------------------------------------------------------------------+ //| Opening Buy position | //+------------------------------------------------------------------+ void Buy(int magicnumber,string symbol,double lots,double tp,double sl) { //--- declare and initialize the trade request and result of trade request MqlTradeRequest request = {0}; MqlTradeResult result = {0}; //--- parameters of request request.action = TRADE_ACTION_DEAL; // type of trade operation request.symbol = symbol; // symbol request.volume = lots; // volume request.type = ORDER_TYPE_BUY; // order type request.price = SymbolInfoDouble(symbol,SYMBOL_ASK); // price for opening request.deviation = 3; // allowed deviation from the price request.sl = sl; // Stop Loss of the position request.tp = tp; // Take Profit of the position request.magic = magicnumber; // MagicNumber of the order //--- send the request if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // if unable to send the request, output the error code //--- information about the operation PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order); } //+------------------------------------------------------------------+ //| Opening Sell position | //+------------------------------------------------------------------+ void Sell(int magicnumber,string symbol,double lots,double tp,double sl) { //--- declare and initialize the trade request and result of trade request MqlTradeRequest request = {0}; MqlTradeResult result = {0}; //--- parameters of request request.action = TRADE_ACTION_DEAL; // type of trade operation request.symbol = symbol; // symbol request.volume = lots; // volume request.type = ORDER_TYPE_SELL; // order type request.price = SymbolInfoDouble(symbol,SYMBOL_BID); // price for opening request.deviation = 3; // allowed deviation from the price request.sl = sl; // Stop Loss of the position request.tp = tp; // Take Profit of the position request.magic = magicnumber; // MagicNumber of the order //--- send the request if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // if unable to send the request, output the error code //--- information about the operation PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order); } //+------------------------------------------------------------------+
Блог им. andresh
- 10 июня 2014, 16:55
- |
- Андрэ
-
попробовал запустить советник в МТ4 на MQL4:
extern int H = 14;
extern int M = 25;
int start()
{
if(OrdersTotal()==0 && Hour( )==H && Minute( ) ==M)
OrderSend(«USDJPY», OP_SELL,0.1,Bid,0,Ask+200*Point,Ask-200*Point,»»,123,0,Red);
}
и никак не могу разобраться, чего не хватает. ошибок нет, но есть 2 предупреждения:
return value of ‘OrderSend’ should be checked
not all control paths return a value
не могу понять, что ещё нужно… Пожскажите пожалуйста, а?
- Ключевые слова:
- MQL4,
- советники
- хорошо
-
0
25 комментариев
- 10 июня 2014, 17:08
- Ответить
Язык недавно сильно переработали, возможно поэтому.
- 10 июня 2014, 17:11
- Ответить
The0bald, пасип. да туповат я, видимо. не могу там найти. ща ещё раз попробую.)
- 10 июня 2014, 17:13
- Ответить
5й параметр — проскальзывание может добавить, чтобы больше нуля.
а если это весь код то должен быть последним оператор return(0);
- 10 июня 2014, 17:12
- Ответить
Бартоломей Цигенбальг, Ура, второе замечание исчезло!!! Осталось только: return value of ‘OrderSend’ should be checked
- 10 июня 2014, 17:14
- Ответить
Андрэ, это про return. про 5-й параметр соображаю…
- 10 июня 2014, 17:15
- Ответить
Бартоломей Цигенбальг, это про return. про 5-й параметр соображаю… не поясните?
- 10 июня 2014, 17:16
- Ответить
так красивее и все всех устраивает )))
проскальзывание дает шанс открыться по рынку при худшей цене на заданное отклонение именно этим параметром.
- 10 июня 2014, 17:17
- Ответить
Бартоломей Цигенбальг, ух ты!!! ошибок нет! Спасибо большое! )))) буду ковыряться дальше! )
- 10 июня 2014, 17:24
- Ответить
Андрэ, не совсем правильно в коде, потому что он за минуту пока удовлетворяет условиям может кучу ордеров наоткрывать )))
- 10 июня 2014, 17:26
- Ответить
не не норм. там есть проверка на количество открытых ордеров
- 10 июня 2014, 17:35
- Ответить
Бартоломей Цигенбальг, тоже присмотрелся, сообразил! )))) спасибо огромное! плюсануть не могу, плюсовалка не позволяет)
- 10 июня 2014, 17:37
- Ответить
имхо, лучше с mql5 начать изучение. 4 недавно сильно переделали — книга не актуальна, справка не доделана, не понятно какие функции заменили на аналог из мт5 какие старые оставили, косяки наверняка есть после серьезной переработки.
- 10 июня 2014, 17:44
- Ответить
The0bald, логично, НО, эти советники на МТ4 не работают, насколько я знаю. это придётся и платформу менять, а не хотелось бы.
- 10 июня 2014, 17:46
- Ответить
Андрэ, На новой МТ4 старые исходники все равно придется переделывать.
- 10 июня 2014, 18:24
- Ответить
The0bald, возможно. просто у меня сейчас 2 робота на МТ4 работают, я доволен. вот, взялся сам изучать роботописательство. пока я «БЛИЖЕ» к МТ4. ) вы пишете сами? успешно?
- 10 июня 2014, 18:28
- Ответить
Андрэ, Пишу давно, правда индикаторы в основном
- 10 июня 2014, 18:30
- Ответить
The0bald, Привет, можно обращятся с просьбой по поводу mql если не трудно?
- 10 июня 2014, 21:00
- Ответить
нужно посмотреть на один индюк, выдает сигнал не всегда а нужно чтобы всегда выдал, если вам удобно можно в скайп общятся, мой скайп dimii1000
- 10 июня 2014, 22:17
- Ответить
в личку не могу писать, рейтинга не хватает (( я тут больше читатель, почту оставьте если не трудно, моя почта trader-profit@mail.ru
- 10 июня 2014, 22:42
- Ответить
- 10 июня 2014, 22:53
- Ответить
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
int Counted_bars; // Количество просчитанных баров
Counted_bars=IndicatorCounted(); // Количество просчитанных баров
int i=Bars-Counted_bars-1; // Индекс первого непосчитанного
if (i>History-1) // Если много баров то ..
i=History-1; // ..рассчитывать заданное колич.
while(i>=0) // Цикл по непосчитанным барам
{
double MA_l_0 = iMA(NULL,0,perMA_1,0,modeMA_1,PRICE_CLOSE,i);
double MA_l_1 = iMA(NULL,0,perMA_1,0,modeMA_1,PRICE_CLOSE,i+1);
double MA_g_0 = iMA(NULL,0,perMA_2,0,modeMA_2,PRICE_CLOSE,i);
double MA_g_1 = iMA(NULL,0,perMA_2,0,modeMA_2,PRICE_CLOSE,i+1);
double STD_0 = iStdDev(NULL,0,perSTD,0,modeSTD,PRICE_CLOSE,i);
double STD_1 = iStdDev(NULL,0,perSTD,0,modeSTD,PRICE_CLOSE,i+1);
//double ELR_1=((High[i]+Low[i])/2)-iMA(NULL,0,perELR,0,1,PRICE_CLOSE,i);
//double ELR_2=((High[i]+Low[i])/2)-iMA(NULL,0,perELR,0,1,PRICE_CLOSE,i+1);
//Buy
if(MA_l_0 > MA_l_1 &&
MA_g_0 > MA_g_1 &&
STD_0 > STD_1)
if(Hour() < 9 || Hour() > 20) UPBuffer[i] = 0;
else UPBuffer[i] = Low[i];
else
//Sell
if(MA_l_0 < MA_l_1 &&
MA_g_0 < MA_g_1 &&
STD_0 > STD_1 )
if(Hour() < 9 || Hour() > 20) DNBuffer[i] = 0;
else DNBuffer[i] = High[i];
i--;
}
//--- return value of prev_calculated for next call
return(rates_total);
}
советник 111
добрый день! прошу помочь в написании советника. Опишу как он должен работать. Пример: пользователь советника заранее выбирает, будет советник торговать только в бай или только селл. Допустим выбрали селл. Свеча закрылась бычья, советник на открытии следующей свечи продает, следующая свеча опять бычья, советник опять продает, следующая свеча закрылась медвежья:) советник ничего не делает) но есть одно условие, если тело свечи меньше 5пп и свеча закрылась бычья советник тоже ничего не делает, при достижении стоп лосса, закрываются все орде сразу, и при достижении тейк профита, также закрываются все ордера разом. Настраеваемые параметры: 1) выбор торговли: Бай/селл. 2) лот 3) стоп лосс от первого ордера( при его достижении закрываются все ордера, если будут открыты) 4) тейк профит от первого ордера ( закрываются так же все ордера при его достижении) 5) размер тела свечи в пунктах ( если торгуем бай, то условие для покупки: тело медвежьей свечи больше 5пп, для продаже обратное)
-
111111 - Сообщений: 245
- Зарегистрирован: 06 ноя 2013, 14:51
- Средств на руках: 7.60
- Группа: Базовая
- Благодарил (а): 148 раз.
- Поблагодарили: 15 раз.
Re: советник 111
Рэндом » 04 апр 2014, 13:07
В понедельник сделаю.
-
Рэндом - Специалист MQL
- Сообщений: 13700
- Зарегистрирован: 18 июл 2013, 08:05
- Средств на руках: 31.45
- Группа: Администраторы
- Благодарил (а): 1131 раз.
- Поблагодарили: 3172 раз.
Каждый заблуждается в меру своих возможностей.
Re: советник 111
Рэндом » 07 апр 2014, 03:00
Что делать если после появления противоположного сигнала (когда сделка не открывается) появиться новый сигнал?
Сколько позиций открывать? А то может так получиться что позиции будут открыты на весь депозит.
-
Рэндом - Специалист MQL
- Сообщений: 13700
- Зарегистрирован: 18 июл 2013, 08:05
- Средств на руках: 31.45
- Группа: Администраторы
- Благодарил (а): 1131 раз.
- Поблагодарили: 3172 раз.
Каждый заблуждается в меру своих возможностей.
Re: советник 111
111111 » 07 апр 2014, 10:50
Рэндом писал(а):Что делать если после появления противоположного сигнала (когда сделка не открывается) появиться новый сигнал?
Сколько позиций открывать? А то может так получиться что позиции будут открыты на весь депозит.
продолжать открывать позиции, можно ввести еще один параметр, мах число открытых позиций. допустим 5.
-
111111 - Сообщений: 245
- Зарегистрирован: 06 ноя 2013, 14:51
- Средств на руках: 7.60
- Группа: Базовая
- Благодарил (а): 148 раз.
- Поблагодарили: 15 раз.
Re: советник 111
Рэндом » 07 апр 2014, 11:02
Теперь завтра с утра будет готово.
-
Рэндом - Специалист MQL
- Сообщений: 13700
- Зарегистрирован: 18 июл 2013, 08:05
- Средств на руках: 31.45
- Группа: Администраторы
- Благодарил (а): 1131 раз.
- Поблагодарили: 3172 раз.
Каждый заблуждается в меру своих возможностей.
Re: советник 111
Рэндом » 08 апр 2014, 03:29
Вот.
Параметры:
Diapozon — минимальный диапазон свечи в пунктах
SL — стоп лосс в пунктах
TP — тэйк профит в пунктах
Lot — лот
Slipage — проскальзывание в пунктах
Count — максимальное количество сделок
TBuy — true открывать длинные позиции
TSell — true открывать короткие позиции
- Вложения
-
BarsEx.mq4
- (2.78 KB) Скачиваний: 34
-
Рэндом - Специалист MQL
- Сообщений: 13700
- Зарегистрирован: 18 июл 2013, 08:05
- Средств на руках: 31.45
- Группа: Администраторы
- Благодарил (а): 1131 раз.
- Поблагодарили: 3172 раз.
Каждый заблуждается в меру своих возможностей.
Re: советник 111
111111 » 08 апр 2014, 16:57
Рэндом писал(а):Вот.
Параметры:
Diapozon — минимальный диапазон свечи в пунктах
SL — стоп лосс в пунктах
TP — тэйк профит в пунктах
Lot — лот
Slipage — проскальзывание в пунктах
Count — максимальное количество сделок
TBuy — true открывать длинные позиции
TSell — true открывать короткие позиции
советник выдает ошибку:return value of ‘OrderSend’ should be checked BarsEx.mq4 76 10
точнее четыре таких.
-
111111 - Сообщений: 245
- Зарегистрирован: 06 ноя 2013, 14:51
- Средств на руках: 7.60
- Группа: Базовая
- Благодарил (а): 148 раз.
- Поблагодарили: 15 раз.
Re: советник 111
mfcoder » 08 апр 2014, 19:04
111111 писал(а):
советник выдает ошибку:return value of ‘OrderSend’ should be checked BarsEx.mq4 76 10
точнее четыре таких.
это не ошибка, а предупреждение..
с некоторых пор умный компилятор делает замечание о том, что правильно было бы присваивать возвращаемое значение функции OrderSend()
типа int res = OrderSend(…);
в принципе это необязательно делать
-
mfcoder - Сообщений: 1531
- Зарегистрирован: 29 июл 2013, 11:55
- Средств на руках: 26.85
- Группа: Базовая
- Благодарил (а): 78 раз.
- Поблагодарили: 423 раз.
Re: советник 111
Рэндом » 09 апр 2014, 05:21
Вот, исправил.
- Вложения
-
BarsEx.mq4
- (2.8 KB) Скачиваний: 39
-
Рэндом - Специалист MQL
- Сообщений: 13700
- Зарегистрирован: 18 июл 2013, 08:05
- Средств на руках: 31.45
- Группа: Администраторы
- Благодарил (а): 1131 раз.
- Поблагодарили: 3172 раз.
Каждый заблуждается в меру своих возможностей.
Re: советник 111
111111 » 09 апр 2014, 17:05
Рэндом писал(а):Вот, исправил.
прошу прощения, но на билде 625, советник даже не отображается в списке советников. В чем может быть дело?
-
111111 - Сообщений: 245
- Зарегистрирован: 06 ноя 2013, 14:51
- Средств на руках: 7.60
- Группа: Базовая
- Благодарил (а): 148 раз.
- Поблагодарили: 15 раз.
Кто сейчас на форуме?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42
Права доступа к форуму
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения
- Форум посвящен форекс-трейдингу, изучению MQL и правилам инвестирования