Выглядеть это должно примерно так?
bool StopBuy = false;
if(Day()==TimeDay(OrderOpenTime()) ) return(0);
{
for(int cnt=0;cnt {
OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
}
StopBuy = true
}
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Помогите с неприятностью новичку.
Прописал внешний индикатор в советнике, а при тестировании на каждом тике индикатор открывается в новом окне. Как от этого избавиться?
То, что Вы написали, работать не будет. Я недавно код скидывал в эту ветку с функцией анализа истории (думал для Вас писал). Вкратце: - в истории надо найти свои ордера, искать надо с конца, дата закрытия - сегодня, если нашли бай, то стопбай=труе. В основной функции проверять стопбай перед проверкой условий на бай.
:-o Такого ещё небыло... Silentspec даже спрашивал - как такое сделать, но ему никто не подсказал... Будьте добры поделитесь кодом. =d>
Прописал внешний индикатор в советнике, а при тестировании на каждом тике индикатор открывается в новом окне. Как от этого избавиться?
Никакого кода пока нет
int start()
{
if(timeprev == Time[0]) return(0);
timeprev = Time[0];
Pindi = iCustom(NULL, 0, "PI bg", period, fl, 0, 0);
// PI_UP = iCustom(NULL, 0, "PI bg", period, fl, 1, 0); // Up
// PI_DN = iCustom(NULL, 0, "PI bg", period, fl, 2, 0); // Dn
Print("PI = "+ PI); // + "; PI_UP = " + PI_UP + "; PI_DN = " + PI_DN);
return(0);
}
В результате на каждой свечке открывается еще одно окно индикатора (10 свечек = 10 индикаторов).
Значит всё дело в "PI bg" - что за зверь?
Ребят, подскажите, можно ли так подсчитать полную стоимость серии ордеров?
Profit += OrderProfit() + OrderCommission() + OrderSwap();
Viri
Значит всё дело в "PI bg" - что за зверь?
Трендовый осцилятор, показывает гистограмму двух цветов. Изменение цвета гистограммы сигнализирует о развороте цены или изменении направления.
По истории было видно что перерисовывается, вот и решил посмотреть насколько страшны будут последствия.
Да.
Ребят, подскажите, можно ли так подсчитать полную стоимость серии ордеров?
Profit += OrderProfit() + OrderCommission() + OrderSwap();
Последствия будут как и у всех: слив на флёте.
Трендовый осцилятор, показывает гистограмму двух цветов. Изменение цвета гистограммы сигнализирует о развороте цены или изменении направления.
По истории было видно что перерисовывается, вот и решил посмотреть насколько страшны будут последствия.
ЦитатаТо, что Вы написали, работать не будет. Я недавно код скидывал в эту ветку с функцией анализа истории (думал для Вас писал). Вкратце: - в истории надо найти свои ордера, искать надо с конца, дата закрытия - сегодня, если нашли бай, то стопбай=труе. В основной функции проверять стопбай перед проверкой условий на бай.
Долго искал, не нашел...
А будет ли работать, если сделать так:
int CountSellOrdersClosed()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
bool select1 = OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY);
datetime oct = OrderCloseTime();
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL && Day() == TimeDay(oct))
count++;
}
}
return(count);
}
А потом в условии открытия ордера проверять, чтобы CountSellOrdersClosed() была == 0
Сработает?
Я не уверен в Day() == TimeDay(oct)
Нет.
Сработает?
ToDay = iTime(NULL, PERIOD_D1, 0);
for (oNum = OrdersHistoryTotal(); oNum >=0 ; oNum--) {
if (OrderSelect(oNum, SELECT_BY_POS, MODE_HISTORY) == TRUE) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (OrderOpenTime() >= ToDay)
{
if (OrderType() == OP_BUY) cnt_Buy_ToDay++;
if (OrderType() == OP_SELL) cnt_Sel_ToDay++;
}
else break;
}
}
}
Это рабочий код из моей совы.
Изменено 15 августа, 2014 пользователем 0ll
А что за oNum?
ее же вроде как инициализировать надо?
и cnt_Buy_ToDay
и cnt_Sell_ToDay
double cnt_Buy_ToDay = 0;
double cnt_Sell_ToDay = 0;
double ToDay = iTime(NULL, 0, 0);
for (int oNum = OrdersHistoryTotal(); oNum >=0 ; oNum--) {
if (OrderSelect(oNum, SELECT_BY_POS, MODE_HISTORY) == TRUE) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (OrderOpenTime() >= ToDay)
{
if (OrderType() == OP_BUY) cnt_Buy_ToDay++;
if (OrderType() == OP_SELL) cnt_Sell_ToDay++;
}
else break;
}
}
}
А в условии на открытие ордера if( cnt_Buy_ToDay >0)
и в timeframe нужно дневной указывать именно, или любой?
cnt_Buy_ToDay и cnt_Sell_ToDay - тоже int (счётчики)
таймфрем Д1 для того чтоб загнать в переменную дату-время начала дня (мы-же за текущий день говорим)
если cnt_Buy_ToDay > 0 - значит ордера сегодня уже открывались. Что с этим делать решать Вам.
ага, работает
спасибо большое)
Ребят, вот ещё такой вопрос, раньше не приходилось сталкиваться. Что должно происходить, если бот стоит на живом рынке и при этом поменять код в эдиторе, а затем скомпилировать, не убирая при этом бота с графика? У меня бот при этом удалил и снова поставил стоповые отложки по заданным условиям, хотя в коде условия по их удалению не подошли.
Понимаю что лезть в код работающего бота глупость, но просто хотелось бы знать, как такие действия расцениваются и обрабатываются на программном уровне, заложенном разработчиками.
Произойдет деинициализация советника, а затем инициализация.
То же самое, как если бы вы выключили, а потом включили терминал.
Например: кусок кода и описание ошибки.
Я брал с первого (а почему - уже не помню):
0ll, подскажи, по индикатору TMA+CG не было ли каких-то особенностей по взятию с него данных, например обязательно с нулевого или первого бара?
upper_TMA = iCustom(NULL, 0, "TMA+CG", "current time frame", ТМА_HalfLength, PRICE_WEIGHTED, ТМА_Deviations, true, 1, 1);
lower_TMA = iCustom(NULL, 0, "TMA+CG", "current time frame", ТМА_HalfLength, PRICE_WEIGHTED, ТМА_Deviations, true, 2, 1);
Добрый вечер!
Посмотрел урок по качественному открытию и модификации ордеров, хочу, чтобы в моем советнике выполнялась проверка на ошибки. Но столкнулся с проблемой: при компиляции метаэдитор требует вернуть некое значение в двух местах
#include
//+------------------------------------------------------------------+
//| test8.mq4 |
//| Copyright 2014, Oleg Novinsky. |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Oleg Novinsky."
#property link ""
#property version "1.00"
#property strict
int signal =1;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if (signal == 1)
{
int ticket = OrderSendX(Symbol(), OP_BUY, 0.1, Ask, 30,0,0,"", 123, 0, Blue );
double asl = NormalizeDouble(Ask -300*Point, Digits);
double atp = NormalizeDouble(Ask + 500*Point, Digits);
}
}
//+------------------------------------------------------------------+
int OrderSendX( string symbol, int cmd, double volume, double price, int slippage, double stoploss,
double takeprofit, string comment, int magic = 0, datetime expiration = 0, color arrow_color=CLR_NONE)
{
int err = GetLastError();
err = 0;
bool exit_loop = false;
int ticket = -1;
int retry = 10;
int cnt = 0;
if(cmd == OP_BUY || cmd == OP_SELL)
{
while(!exit_loop)
{
ticket = OrderSend(symbol, cmd, volume, price, slippage,stoploss, takeprofit, comment, magic, expiration, arrow_color );
err = GetLastError();
switch(err)
{
case ERR_NO_ERROR:
exit_loop = true;
break;
case ERR_SERVER_BUSY:
case ERR_NO_CONNECTION:
case ERR_BROKER_BUSY:
case ERR_TRADE_CONTEXT_BUSY:
cnt++;
break;
case ERR_INVALID_PRICE:
case ERR_PRICE_CHANGED:
case ERR_OFF_QUOTES:
case ERR_REQUOTE:
RefreshRates();
continue;
default:
exit_loop = true;
break;
}
if(cnt>retry)
exit_loop = true;
if (!exit_loop)
{
Sleep(1000);
RefreshRates();
}
else
{
if( err != ERR_NO_ERROR)
{
Print("Ошибка :" + err);
}
}
if(err == ERR_NO_ERROR)
{
if ( OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES))
{
Print ("Ордер успешно выбран");
}
else Print("Одер не выбран");
return(ticket);
}
Print ("Ошибка открытия ордера после" + cnt + "попыток.");
}
}
}
//+------------------------------------------------------------------+
bool OrderModifyX(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
{
if(OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES))
{
price = NormalizeDouble(price, Digits);
stoploss = NormalizeDouble(stoploss, Digits);
takeprofit = NormalizeDouble(takeprofit, Digits);
CheckValidStop (Symbol(), price, stoploss);
int err = GetLastError();
err = 0;
bool exit_loop = false;
bool result;
int retry = 10;
int cnt = 0;
while(!exit_loop)
{
result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError();
if (result == true)
{
Print("Ордер#" + ticket + "успешно модифицирован.");
return(true);
switch(err)
{
case ERR_NO_ERROR:
exit_loop = true;
break;
case ERR_SERVER_BUSY:
case ERR_NO_CONNECTION:
case ERR_BROKER_BUSY:
case ERR_TRADE_CONTEXT_BUSY:
cnt++;
break;
case ERR_INVALID_PRICE:
case ERR_PRICE_CHANGED:
case ERR_OFF_QUOTES:
case ERR_REQUOTE:
RefreshRates();
continue;
default:
exit_loop = true;
break;
}
}
}
if(err != ERR_NO_ERROR)
{
Print ("Ошибка модификации ордера #" + ticket);
Print ("Код ошибки: " + err);
}
}
else
{
Print("Не удалось выбрать ордерб ticket = " + ticket);
return(false);
}
}
//+------------------------------------------------------------------+
void CheckValidStop (string symbol, double price, double& sl)
{
if(sl == 0)
return;
double servers_min_stop = MarketInfo(symbol, MODE_STOPLEVEL) * MarketInfo (symbol, MODE_POINT);
if(MathAbs (price - sl) {
if(price > sl)
sl = price - servers_min_stop;
else sl = sl + servers_min_stop;
}
sl = NormalizeDouble(sl, MarketInfo (symbol, MODE_DIGITS));
}
Ошибки вот где


Потому что перед этими } твоими ты забыл написать return(значение твое);
Функция у тебя
int OrderSendX
должна значение интегер вернуть,
bool OrderModifyX должна тру/фалс вернуть
В первом случае 0,
во втором true
Кроме прямых ошибок, на которые указал Silentspec есть логические в этом куске:
Добрый вечер!
while(!exit_loop) //Цикл на модификацию ордера
{
result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError(); //Получение кода ошибки
if (result == true) //Если ордер модифицирован - !
{
Print("Ордер#" + ticket + "успешно модифицирован.");
return(true); //Так как закрывающей скобки "}" нет, то выход в любом случае
switch(err) //Обработка ошибки - сюда выполнение не дойдёт !!!!!!!!!!!!!!!!!!!!
Проверьте весь блок модификации отрытого ордера - кривая логика.
ЦитатаКроме прямых ошибок, на которые указал Silentspec есть логические в этом куске:
while(!exit_loop) //Цикл на модификацию ордера
{
result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError(); //Получение кода ошибки
if (result == true) //Если ордер модифицирован - !
{
Print("Ордер#" + ticket + "успешно модифицирован.");
return(true); //Так как закрывающей скобки "}" нет, то выход в любом случае
switch(err) //Обработка ошибки - сюда выполнение не дойдёт !!!!!!!!!!!!!!!!!!!!
Проверьте весь блок модификации отрытого ордера - кривая логика.
то есть если сделать так, то должно дойти до switch?
while(!exit_loop)
{
result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError(); //Получение кода ошибки
if (result == true)
{
Print("Ордер#" + ticket + "успешно модифицирован.");
return(true);
}
switch(err)
или нужно добавить else
while(!exit_loop)
{
result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError(); //Получение кода ошибки
if (result == true)
{
Print("Ордер#" + ticket + "успешно модифицирован.");
return(true);
}
else
{
switch(err)
}
Второй вариант
Т.к. в if включен return, то оба варианта будут работать одинаково...
то есть если сделать так, то должно дойти до switch?
Понял, спасибо
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем