Добрый день!
Подскажите хороший пример советника использующего в работе лимитные ордера.
Интересует следующее:
1. Выставление лимитного ордера близко к рынку
2. Модификация ордера и выставление в рынок
3. Удаление и экспирация ордера
4. Обработка ошибок
Буду очень признателен, если пример советника будет ориентриован на HFT или хотя бы большое количество сделок внутри дня.
Спасибо!
1)
Близкое выставление BuyLimit и SellLimit (но это очень упрощённо, без проверок)
//| Stop Loss Take Profit.mq5 |
//| Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.00"
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
//--- input parameters
input ushort InpIndent=2; // Indent (in pips)
//---
double ExtIndent;
bool FirstStart=true; // true - first start
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetMarginMode();
if(!IsHedging())
{
Print("Hedging only!");
return(INIT_FAILED);
}
m_symbol.Name(Symbol()); // sets symbol name
m_symbol.Refresh(); // refreshes the symbol data
if(!RefreshRates())
{
Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
return(INIT_FAILED);
}
//--- tuning for 3 or 5 digits
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
ExtIndent=InpIndent *digits_adjust*m_symbol.Point();
FirstStart=true;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(FirstStart)
{
if(!RefreshRates())
return;
m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.Ask()-ExtIndent);
m_trade.SellLimit(m_symbol.LotsMin(),m_symbol.Bid()+ExtIndent);
FirstStart=false;
}
}
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data |
//+------------------------------------------------------------------+
bool RefreshRates()
{
//--- refresh rates
if(!m_symbol.RefreshRates())
return(false);
//--- protection against the return value of "zero"
if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SetMarginMode(void)
{
m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool IsHedging(void)
{
return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
}
//+------------------------------------------------------------------+
И результат:
1)
Близкое выставление BuyLimit и SellLimit (но это очень упрощённо, без проверок)
//| Stop Loss Take Profit.mq5 |
//| Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.00"
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
//--- input parameters
input ushort InpIndent=2; // Indent (in pips)
//---
double ExtIndent;
bool FirstStart=true; // true - first start
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetMarginMode();
if(!IsHedging())
{
Print("Hedging only!");
return(INIT_FAILED);
}
m_symbol.Name(Symbol()); // sets symbol name
m_symbol.Refresh(); // refreshes the symbol data
if(!RefreshRates())
{
Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
return(INIT_FAILED);
}
//--- tuning for 3 or 5 digits
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
ExtIndent=InpIndent *digits_adjust*m_symbol.Point();
FirstStart=true;
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(FirstStart)
{
if(!RefreshRates())
return;
m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.Ask()-ExtIndent);
m_trade.SellLimit(m_symbol.LotsMin(),m_symbol.Bid()+ExtIndent);
FirstStart=false;
}
}
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data |
//+------------------------------------------------------------------+
bool RefreshRates()
{
//--- refresh rates
if(!m_symbol.RefreshRates())
return(false);
//--- protection against the return value of "zero"
if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SetMarginMode(void)
{
m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool IsHedging(void)
{
return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
}
//+------------------------------------------------------------------+
И результат:
Ну так это пример. Как конструктор. Потом ещё добавить, потом ещё добавить...
толково, даже смешно [местами] -- но мне тоже хотелось бы посмотреть на хороший пример работы с отложками -- "ваше мнение очень ценно для нас" [слоган]
толково, даже смешно [местами] -- но мне тоже хотелось бы посмотреть на хороший пример работы с отложками -- "ваше мнение очень ценно для нас" [слоган]
Торгую только через отложки тучу времени. Никакой обработки не делаю. OrderSend вернул -1 (MT4 или MT5+MT4Orders) - не получилось и ладно, потому что на следующем шаге все равно полностью просматривается торговое окружение. И если отложки/позы нет, а должна быть, то идет синхронизация с тем состоянием, которое должно быть - отправляется соответствующий OrderSend.
При таком подходе все нюансы реджектов, частичных исполнений и прочего учитываются. И реализация получается очень простой и эффективной. Ни разу не подвела.
Асинхронные варианты не пробовал, тут не видится сильно сложнее, но утверждать не возьмусь.
Асинхронные варианты не пробовал, тут не видится сильно сложнее, но утверждать не возьмусь.
@Vladimir Karputov Карпутов, всё хочу вас спросить. Ваших примеров на форуме становится всё больше и больше. Вы переводите кодабазу mql4 на mql5 как это делает Годзилла. Но кода Годзиллы читаемые и на уровне. Их при всей критике полезности можно смело использовать новичками для образца. В вашем случае трудно сказать насколько ваши кода востребованы, т.к. как по мне, обоснованность использования СБ сомнительна, особенно новичками. И как по мне, такая популяризация как делаете вы -- только вредит, т.к. сводить в ноль понимание того что вы поясняете и зачем. Но это моё мнение.
Тем не менее в каждом своём коде вы пишите:
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
digits_adjust=10;
ExtIndent=InpIndent *digits_adjust*m_symbol.Point();
Вы можете пояснить зачем?
В вашем примере:
-- целое
Может вообще отменить пятизнак, если в каждом коде его преимущества, с вашего "совета", не играют никакой роли.
потому что на следующем шаге все равно полностью просматривается торговое окружение.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день!
Подскажите хороший пример советника использующего в работе лимитные ордера.
Интересует следующее:
1. Выставление лимитного ордера близко к рынку
2. Модификация ордера и выставление в рынок
3. Удаление и экспирация ордера
4. Обработка ошибок
Буду очень признателен, если пример советника будет ориентриован на HFT или хотя бы большое количество сделок внутри дня.
Спасибо!