Добрый день. Пожалуйста помогите начинающему трейдеру в поиске подходящего советника для автоматизированной торговли, который способен открывать локированные ордера в валютных парах с возможностью произвольной установки тейк-профитов. Спасибо вам.
abcxyzabcxyz: Добрый день. Пожалуйста помогите начинающему трейдеру в поиске подходящего советника для автоматизированной торговли, который способен открывать локированные ордера в валютных парах с возможностью произвольной установки тейк-профитов. Спасибо вам.
Если Вам действительно нужно локирование - то Вас сюда. На MetaTrader 5 локирования нет, так как платформа MetaTrader 5 - неттинговая.
Смотрите в сторону шаблонов. Этот код вернет имя класса или примитивного типа.
#include <Trade\Trade.mqh> //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ voidOnStart() { //--- CTrade trade; double d_value=M_PI; int i_value=INT_MAX; Print("d_value: type=",GetTypeName(d_value), ", value=", d_value); Print("i_value: type=",GetTypeName(i_value), ", value=", i_value); Print("trade: type=",GetTypeName(trade)); //--- } //+------------------------------------------------------------------+ //| Возвращает в строковом виде тип | //+------------------------------------------------------------------+ template<typename T> string GetTypeName(const T &t) { //--- вернем тип в виде строки return(typename(T)); //--- }
Во! Ужу что-то! Но с new не работает - в коде пример, чего мне нужно - может кто подскажет какие способы?
class a{
public:
virtualvoidPrint(){Print("Print class a");}
};
class b:public a{
public:
virtualvoidPrint(){Print("Print class b");}
};
class c:public a{
public:
virtualvoidPrint(){Print("Print class c");}
void Print2(){Print("!Print2! class c");}
};
void add(a *&arr[], bool var)
{
ArrayResize(arr, ArraySize(arr)+1);
if (var)
arr[ArraySize(arr)-1] = new b;
else
arr[ArraySize(arr)-1] = new c;
}
voidOnStart()
{
//---
a *arr[];
add(arr, true); // На самом деле здесь я НЕ знаю, какой класс добавит функция add
add(arr, false); // Это потомок класса а или сам класс а, исходный код которого я править не могу.for (int i = 0; i < ArraySize(arr); i++)
{
// Вот тут то мне и надо узнать, что за класс там// шаблон вернет *а, как и объявлено. Но мне надо проверить - можно ли вызвать функцию, которая есть только в сif (i == 1) // Вот тут должна быть проверка на имя класса
{
c *tmp = arr[i];
tmp.Print2();
}
}
//---
}
Во! Ужу что-то! Но с new не работает - в коде пример, чего мне нужно - может кто подскажет какие способы?
Это проблема шаблонного метода. К сожалению шаблонный метод возвращает название класса ссылающегося на экземпляр. Тип самого экзепляра по-прежнему неизвестен.
Кто-нибудь может мне объяснить почему приведенный код не работает в тестере, в то время как в реал-тайм он работает!!? Конкретно интересует, почему в тестере после HistorySelect(0, TimeCurrent()) не доступны свойства HistoryOrderGetInteger...
p.s. Что интересно, первый ордер в тестере обрабатывается корректно, а остальные уже нет. И еще, если расскоментировать HistroryOrderSelect(ticketOrder) то в реал-тайм начнет вываливаться соообщение что ордер не был выбран, а в тестере стратегий наоборот, все начнет работать, за исключением первого ордера.
И у меня какая-то проблема с HistorySelect(). Открываю скриптом позицию отправкой маркет-ордера, и если сделка открылась, тут же смотрю количество сделок в истории с момента запуска скрипта, причём проверяю его 10 раз с интервалом в секунду. Должна быть, понятное дело, одна сделка. Вот скрипт:
voidOnStart()
{
// время запуска скриптаdatetime dtStartTime = TimeCurrent();
// структуры запросаMqlTradeRequest oRequest = {0};
MqlTradeResult oResult = {0};
// формируем запрос
oRequest.action = TRADE_ACTION_DEAL;
oRequest.magic = 15;
oRequest.symbol = _Symbol;
oRequest.volume = 0.1;
oRequest.type = ORDER_TYPE_BUY;
oRequest.type_filling = ORDER_FILLING_FOK;
oRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
oRequest.deviation = 1000;
// шлём ордерbool bResult = OrderSend(oRequest, oResult);
// если позиция успешно открытаif(bResult == true && oResult.retcode == 10009) // если позиция открыта
{
for(int i = 0; i < 10; i++)
{
// запрашиваем историю за время работы скриптаHistorySelect(dtStartTime, TimeCurrent());
// количество сделок за время работы скрипта (должна быть одна)Print("Шаг: ", i, " Совершено сделок: ", HistoryDealsTotal());
Sleep(1000);
}
}
}
А вот результат в Альфа-форекс:
Сделка реально совершена, а в истории её нет даже через 10 секунд. Что это? Баг МТ? Глюк Альфы? Какая-то фича, которую я не знаю? У Альпари этот же скрипт работает нормально, только изредка на первом (нулевом) шаге проскакивает ноль (ну, это понятно - не успела ещё обновиться история), все остальные шаги - единица. Но через десять-то секунд почему нет сделки в истории?
И у меня какая-то проблема с HistorySelect(). Открываю скриптом позицию отправкой маркет-ордера, и если сделка открылась, тут же смотрю количество сделок в истории с момента запуска скрипта, причём проверяю его 10 раз с интервалом в секунду. Должна быть, понятное дело, одна сделка. Вот скрипт:
А вот результат у Альфа-брокера:
Сделка реально совершена, а в истории её нет даже через 10 секунд. Что это? Баг МТ? Глюк Альфы? Какая-то фича, которую я не знаю? У Альпари этот же скрипт работает нормально, только изредка на первом (нулевом) шаге проскакивает ноль (ну, это понятно - не успела ещё обновиться история), все остальные шаги - единица. Но через десять-то секунд почему нет сделки в истории?
Напрягает строка
datetime dtStartTime = TimeCurrent();
Вы уверены что dtStartTime и TimeCurrent() не одно и тоже число к моменту for? Возможно округление в одну секунду выставляет совершенную сделку за пределы dtStartTime.
Вы уверены что dtStartTime и TimeCurrent() не одно и тоже число к моменту for? Возможно округление в одну секунду выставляет совершенную сделку за пределы dtStartTime.
А даже если одно, разве МТ не должен выдать историю за эту секунду? Т.е. разве он не выдаёт историю в указанных границах, ВКЛЮЧАЯ сами границы?
Но в любом случае, я пробовал писать и dtStartTime = TimeCurrent() - 1, и dtStartTime = TimeCurrent() - 10. Не помогает.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Добрый день. Пожалуйста помогите начинающему трейдеру в поиске подходящего советника для автоматизированной торговли, который способен открывать локированные ордера в валютных парах с возможностью произвольной установки тейк-профитов. Спасибо вам.
Как вариант: объявите во всех из них метод Type в котором возвращайте идентификатор типа.
Хех, если бы можно было править исходники... Не надо все так упрощать. А все-таки - есть ли на mql5 узнать имя класса???
Хех, если бы можно было править исходники... Не надо все так упрощать. А все-таки - есть ли на mql5 узнать имя класса???
Смотрите в сторону шаблонов. Этот код вернет имя класса или примитивного типа.
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnStart()
{
//---
CTrade trade;
double d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: type=",GetTypeName(d_value), ", value=", d_value);
Print("i_value: type=",GetTypeName(i_value), ", value=", i_value);
Print("trade: type=",GetTypeName(trade));
//---
}
//+------------------------------------------------------------------+
//| Возвращает в строковом виде тип |
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T &t)
{
//--- вернем тип в виде строки
return(typename(T));
//---
}
Смотрите в сторону шаблонов. Этот код вернет имя класса или примитивного типа.
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnStart()
{
//---
CTrade trade;
double d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: type=",GetTypeName(d_value), ", value=", d_value);
Print("i_value: type=",GetTypeName(i_value), ", value=", i_value);
Print("trade: type=",GetTypeName(trade));
//---
}
//+------------------------------------------------------------------+
//| Возвращает в строковом виде тип |
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T &t)
{
//--- вернем тип в виде строки
return(typename(T));
//---
}
Во! Ужу что-то! Но с new не работает - в коде пример, чего мне нужно - может кто подскажет какие способы?
Во! Ужу что-то! Но с new не работает - в коде пример, чего мне нужно - может кто подскажет какие способы?
Кто-нибудь может мне объяснить почему приведенный код не работает в тестере, в то время как в реал-тайм он работает!!? Конкретно интересует, почему в тестере после HistorySelect(0, TimeCurrent()) не доступны свойства HistoryOrderGetInteger...
Скриншот в тестере стратегий:
Скриншот в реал-тайм на демо:
p.s. Что интересно, первый ордер в тестере обрабатывается корректно, а остальные уже нет. И еще, если расскоментировать HistroryOrderSelect(ticketOrder) то в реал-тайм начнет вываливаться соообщение что ордер не был выбран, а в тестере стратегий наоборот, все начнет работать, за исключением первого ордера.
И у меня какая-то проблема с HistorySelect(). Открываю скриптом позицию отправкой маркет-ордера, и если сделка открылась, тут же смотрю количество сделок в истории с момента запуска скрипта, причём проверяю его 10 раз с интервалом в секунду. Должна быть, понятное дело, одна сделка. Вот скрипт:
А вот результат в Альфа-форекс:
Сделка реально совершена, а в истории её нет даже через 10 секунд. Что это? Баг МТ? Глюк Альфы? Какая-то фича, которую я не знаю? У Альпари этот же скрипт работает нормально, только изредка на первом (нулевом) шаге проскакивает ноль (ну, это понятно - не успела ещё обновиться история), все остальные шаги - единица. Но через десять-то секунд почему нет сделки в истории?
И у меня какая-то проблема с HistorySelect(). Открываю скриптом позицию отправкой маркет-ордера, и если сделка открылась, тут же смотрю количество сделок в истории с момента запуска скрипта, причём проверяю его 10 раз с интервалом в секунду. Должна быть, понятное дело, одна сделка. Вот скрипт:
А вот результат у Альфа-брокера:
Сделка реально совершена, а в истории её нет даже через 10 секунд. Что это? Баг МТ? Глюк Альфы? Какая-то фича, которую я не знаю? У Альпари этот же скрипт работает нормально, только изредка на первом (нулевом) шаге проскакивает ноль (ну, это понятно - не успела ещё обновиться история), все остальные шаги - единица. Но через десять-то секунд почему нет сделки в истории?
Напрягает строка
datetime dtStartTime = TimeCurrent();
Вы уверены что dtStartTime и TimeCurrent() не одно и тоже число к моменту for? Возможно округление в одну секунду выставляет совершенную сделку за пределы dtStartTime.
Напрягает строка
datetime dtStartTime = TimeCurrent();
Вы уверены что dtStartTime и TimeCurrent() не одно и тоже число к моменту for? Возможно округление в одну секунду выставляет совершенную сделку за пределы dtStartTime.
А даже если одно, разве МТ не должен выдать историю за эту секунду? Т.е. разве он не выдаёт историю в указанных границах, ВКЛЮЧАЯ сами границы?
Но в любом случае, я пробовал писать и dtStartTime = TimeCurrent() - 1, и dtStartTime = TimeCurrent() - 10. Не помогает.