sure hedging pipschart.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «sure hedging pipschart.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Это торговый советник для MetaTrader 4, написанный на языке MQL4. Советник работает на одном символе графика и использует отложенные ордера для построения сетки хеджирующих сделок. Основной обработчик start() вызывается на каждом тике и управляет открытием, модификацией и удалением ордеров.
Логика советника основана на последовательном открытии рыночных и отложенных ордеров. После открытия первой сделки советник выставляет отложенный ордер противоположного направления на заданном расстоянии. При срабатывании отложенного ордера выставляется следующий отложенный ордер с увеличенным лотом. Количество шагов сетки ограничено десятью уровнями, для каждого из которых можно задать своё расстояние. Объём сделок рассчитывается либо как фиксированный лот, либо пропорционально балансу счёта, с применением коэффициентов умножения для хеджирующих сделок.
Советник поддерживает настройку уровней стоп-лосс и тейк-профит, а также учитывает спред при расчёте уровней для ордеров на продажу. Предусмотрена возможность остановки торговли при достижении заданной дневной прибыли в валюте счёта или в процентах от баланса на начало дня. Для аккаунтов с рыночным исполнением (ECN/STP) можно включить режим, при котором стоп-лосс и тейк-профит устанавливаются после отправки ордера.
Советник содержит встроенную обработку ошибок торговых операций с повторными попытками отправки запросов и ведёт подробный лог в журнал эксперта. Все торговые операции выполняются только по текущему символу и идентифицируются по магическому номеру, начиная с заданного начального значения.
Настройки программы
| Настройка | Описание |
|---|---|
| initial_deal | Начальная сделка — Направление начальной сделки: 0 — покупка, 1 — продажа, любое другое значение — открытие новых сделок отключено. |
| stoploss | Стоп-лосс — Уровень стоп-лосса в пунктах для всех сделок. |
| takeprofit | Тейк-профит — Уровень тейк-профита в пунктах для всех сделок. |
| fixed_lot | Фиксированный лот — Если больше 0, начальная сделка открывается этим фиксированным объёмом. |
| deposit_lot | Лот от депозита — Если fixed_lot равен 0 и deposit_lot больше 0, начальная сделка открывается объёмом, равным балансу, делённому на deposit_lot. |
| martin_koeff1 | Коэффициент Мартингейла 1 — Коэффициент умножения лота для первой хеджирующей сделки. |
| martin_koeff2 | Коэффициент Мартингейла 2 — Коэффициент умножения лота для второй и последующих хеджирующих сделок. |
| enable_daily_profit | Включить дневную прибыль — Включает остановку торговли при превышении заданной дневной прибыли. Учитывается прибыль по всем валютам. |
| daily_profit | Дневная прибыль в валюте — Целевая дневная прибыль в валюте счёта. При достижении этой суммы торговля останавливается, если включена соответствующая опция. |
| daily_profit_percent | Дневная прибыль в процентах — Целевая дневная прибыль в процентах от баланса на начало дня. При достижении этого значения торговля останавливается, если включена соответствующая опция. |
| distance0 | Расстояние 0 — Если больше 0, задаёт расстояние в пунктах для выставления первой хеджирующей сделки. Если значение не задано, используется значение takeprofit. |
| distance1 | Расстояние 1 — Если больше 0, задаёт расстояние в пунктах для выставления второй хеджирующей сделки. |
| distance2 | Расстояние 2 — Если больше 0, задаёт расстояние в пунктах для выставления третьей хеджирующей сделки. |
| distance3 | Расстояние 3 — Если больше 0, задаёт расстояние в пунктах для выставления четвёртой хеджирующей сделки. |
| distance4 | Расстояние 4 — Если больше 0, задаёт расстояние в пунктах для выставления пятой хеджирующей сделки. |
| distance5 | Расстояние 5 — Если больше 0, задаёт расстояние в пунктах для выставления шестой хеджирующей сделки. |
| distance6 | Расстояние 6 — Если больше 0, задаёт расстояние в пунктах для выставления седьмой хеджирующей сделки. |
| distance7 | Расстояние 7 — Если больше 0, задаёт расстояние в пунктах для выставления восьмой хеджирующей сделки. |
| distance8 | Расстояние 8 — Если больше 0, задаёт расстояние в пунктах для выставления девятой хеджирующей сделки. |
| distance9 | Расстояние 9 — Если больше 0, задаёт расстояние в пунктах для выставления десятой хеджирующей сделки. |
| normal_spread | Нормальный спред — Значение в пунктах, которое вычитается из тейк-профита для ордеров на продажу и добавляется к стоп-лоссу для ордеров на продажу, чтобы учесть спред. |
| sep0 | Разделитель — Строковый параметр, используемый как разделитель или метка в настройках советника. |
| params_digits | Разрядность параметров — Если равно 4, стоп-лосс, тейк-профит и расстояния задаются в 4-значных пунктах; если равно 5 — в 5-значных пунктах. |
| initial_magic | Начальный магический номер — Начальный магический номер для первой сделки. Для каждой последующей хеджирующей сделки номер увеличивается на 1. |
| market_execution | Рыночное исполнение — Установите 1 для аккаунтов ECN и STP, чтобы стоп-лосс и тейк-профит устанавливались только после отправки ордера. |
| command_attempts | Количество попыток отправки — Количество попыток одновременной отправки торгового запроса брокеру при возникновении ошибки. |
| max_slippage | Максимальное проскальзывание — Максимально допустимое проскальзывание в пунктах между желаемой ценой и ценой исполнения ордера. |
Поиск по коду файла
#include <stderror.mqh>
#define sec_wait_context 10
#define max_errors 30
#define wait_error 1000
#define busysleep 100
#define EB_NEXTTRY 0
#define EB_WAITTRY 1
#define EB_TERMINATE 2
#define StoplevelAdd 0
extern int initial_deal = 0 ; // Arah kesepakatan awal: 0 - kesepakatan beli, 1 - kesepakatan jual, nilai lain - pembukaan baru dinonaktifkan
extern double stoploss = 60 ; // Stoploss untuk semua transaksi
extern double takeprofit = 30 ; //ambil untung untuk semua transaksi
extern double fixed_lot = 0.1 ; // Jika > 0, kesepakatan awal akan dibuka dengan lot ini
extern double deposit_lot = 0 ; //If fixed_lot is 0 and deposit_lot > 0, the initial deal will be opened with Balance Volume / deposit_lot lot
extern double martin_koeff1 = 3 ; // Pengganda lot untuk transaksi lindung nilai pertama
extern double martin_koeff2 = 2 ; //Lot multiplier for the second, third and subsequent hedging transactions
extern int enable_daily_profit = 0 ; //Enable option to stop trading if daily profit exceeds the following value (this considers profit for ALL currencies)
extern double daily_profit = 0 ; // Keuntungan harian dalam mata uang akun
extern double daily_profit_percent = 0 ; // Keuntungan harian sebagai persen ke Saldo awal hari
extern double distance0 = 30 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai pertama
extern double distance1 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-2
extern double distance2 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-3
extern double distance3 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-4
extern double distance4 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-5
extern double distance5 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-6
extern double distance6 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-7
extern double distance7 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-8
extern double distance8 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-9
extern double distance9 = 0 ; // Jika > 0, jarak untuk menempatkan kesepakatan lindung nilai ke-10
extern double normal_spread = 0 ; //This value in pips is subtracted from SELL takeprofit and added to SELL stoploss to account for spread
extern string sep0 = " common EA settings " ;
extern int params_digits = 4 ; //If = 4, then stoploss, takeprofit and distance are specified in 4-digit points, if = 5, then in 5-digit pips
extern int initial_magic = 123000 ; //Initial magic number for the first deal. Hedging transactions add 1 to this number
extern int market_execution = 0 ; //Set to 1 for ECN and STP accounts (stoploss and takeprofit are modified only after the order is sent)
extern int command_attempts = 5 ; // Jumlah upaya pengiriman permintaan broker secara simultan (jika terjadi kesalahan)
extern int max_slippage = 10 ; //Maximum slippage is the difference between the price desired by the trader when placing an order and the actual price at which the order is executed
int go = true ;
double point, d_stoplevel, d_freezelevel, d_buystop, d_sellstop, d_buytake, d_selltake ;
int errors = 0 ;
int lotsdigits ;
double dist [10] ;
int init()
{
// код доступен только после оплаты
}
int start()
{
// код доступен только после оплаты
}
int ErrorBlock (int err, int ms)
{
string str = "" ;
int res = EB_TERMINATE ;
switch (err)
{
case ERR_NO_ERROR:
str = "No error" ;
break ;
case ERR_NO_RESULT:
str = "Unknown result" ;
break ;
case ERR_COMMON_ERROR:
str = "Common error. Probably the signal was rejected by user or trade direction is denied in expert settings" ;
break ;
case ERR_INVALID_TRADE_PARAMETERS:
str = "Wrong trade function parameters" ;
break ;
case ERR_SERVER_BUSY:
str = "Server is busy. Waiting..." ;
res = EB_WAITTRY ;
break ;
case ERR_OLD_VERSION:
str = "Old version of client terminal" ;
break ;
case ERR_NO_CONNECTION:
str = "No connection with trade server. Waiting..." ;
res = EB_WAITTRY ;
break ;
case ERR_NOT_ENOUGH_RIGHTS:
str = "Not enough rights" ;
break ;
case ERR_TOO_MANY_REQUESTS:
case ERR_TOO_FREQUENT_REQUESTS:
str = "To many requests" ;
break ;
case ERR_MALFUNCTIONAL_TRADE:
str = "Malfunctional trade" ;
break ;
case ERR_ACCOUNT_DISABLED:
str = "The account is blocked" ;
break ;
case ERR_INVALID_ACCOUNT:
str = "Invalid account" ;
break ;
case ERR_TRADE_TIMEOUT:
str = "Trade timeout exceeded" ;
res = EB_NEXTTRY ;
break ;
case ERR_INVALID_PRICE:
str = "Wrong price" ;
res = EB_NEXTTRY ;
break ;
case ERR_INVALID_STOPS:
str = "Invalid stops" ;
break ;
case ERR_INVALID_TRADE_VOLUME:
str = "Invalid trade volume" ;
break ;
case ERR_MARKET_CLOSED:
str = "The market is closed" ;
break ;
case ERR_TRADE_DISABLED:
str = "Trade is disabled" ;
break ;
case ERR_NOT_ENOUGH_MONEY:
str = "Not enough money to complete operation" ;
break ;
case ERR_PRICE_CHANGED:
str = "The price has changed, trying again" ;
res = EB_NEXTTRY ;
break ;
case ERR_OFF_QUOTES:
str = "The broker sent offquotes. Trying again" ;
res = EB_NEXTTRY ;
break ;
case ERR_BROKER_BUSY:
str = "The broker is budy. Waiting..." ;
res = EB_WAITTRY ;
break ;
case ERR_REQUOTE:
str = "The broker sent requote. Trying again" ;
res = EB_WAITTRY ;
break ;
case ERR_ORDER_LOCKED:
str = "The order is already processing" ;
break ;
case ERR_LONG_POSITIONS_ONLY_ALLOWED:
str = "Only long positions allowed" ;
break ;
case ERR_TRADE_MODIFY_DENIED:
str = "Modification is denied because the order is too close to the price" ;
res = EB_WAITTRY ;
break ;
case ERR_TRADE_CONTEXT_BUSY:
if (_IsNotTradeContextBusy () >= 0)
{
res = EB_NEXTTRY ;
}
return (res) ;
case ERR_TRADE_EXPIRATION_DENIED:
str = "Expiration date usage is denied by the broker" ;
break ;
case ERR_TRADE_TOO_MANY_ORDERS:
str = "Too many orders" ;
break ;
case ERR_TRADE_HEDGE_PROHIBITED:
str = "Hedging is denied by broker" ;
break ;
case ERR_TRADE_PROHIBITED_BY_FIFO:
str = "Cannot close a deal because FIFO order is violated" ;
break ;
case 4107:
str = "Wrong price for OrderSend function" ;
break ;
case 4051:
str = "Wrong takeprofit for OrderModify function" ;
default:
str = "Unknown error ?" + DoubleToStr (err, 0) ;
}
str = StringConcatenate (str, " (the request is processed by broker in ", DoubleToStr (GetTickCount () - ms, 0), " ms)") ;
Print (str) ;
return (res) ;
}
int _IsNotTradeContextBusy()
{
if(IsTradeContextBusy())
{
int StartWaitingTime = GetTickCount();
Print("Trade context is busy. Waiting...");
while(true)
{
if(GetTickCount() - StartWaitingTime > sec_wait_context * 1000)
{
Print("Waiting limit exceeded (" + sec_wait_context + " sec.)!");
return(-2);
}
if(!IsTradeContextBusy())
{
return(0);
}
Sleep( busysleep );
}
}
else
{
return(1);
}
}
int MarketModify (int tick, double stop, double take)
{
if (! OrderSelect (tick, SELECT_BY_TICKET) || OrderType () >= 2 || OrderCloseTime () > 0)
{
Print ("Wrong ticket for MarketModify function") ;
return (-3) ;
}
double use_sl = 0, use_tp = 0 ;
if (stop > 0)
{
if (OrderType () == OP_BUY)
{
use_sl = OrderOpenPrice () - stop ;
}
else
{
use_sl = OrderOpenPrice () + stop ;
}
}
if (stop < 0)
{
use_sl = -stop ;
}
if (take > 0)
{
if (OrderType () == OP_BUY)
{
use_tp = OrderOpenPrice () + take ;
}
else
{
use_tp = OrderOpenPrice () - take ;
}
}
if (take < 0)
{
use_tp = -take ;
}
if (MathAbs (OrderStopLoss () - use_sl) < Point && MathAbs (use_tp - OrderTakeProfit ()) < Point)
{
Print ("There was an attempt to modify market order without changes to TP and SL") ;
return (-3) ;
}
int attempt = 1 ;
bool result = false ;
while (attempt <= command_attempts && ! result)
{/*
if ((OrderType () == OP_BUY && (MarketInfo (OrderSymbol (), MODE_BID) - use_sl < d_stoplevel || use_tp - MarketInfo (OrderSymbol (), MODE_BID) < d_stoplevel)) ||
(OrderType () == OP_SELL && (use_sl - MarketInfo (OrderSymbol (), MODE_ASK) < d_stoplevel || MarketInfo (OrderSymbol (), MODE_ASK) - use_tp < d_stoplevel)))
{
Print ("Couldn''t modify order ", tick, " because of broker stops level") ;
return (-2) ;
}
if ((OrderType () == OP_BUY && (MarketInfo (OrderSymbol (), MODE_BID) - use_sl < d_freezelevel || use_tp - MarketInfo (OrderSymbol (), MODE_BID) < d_freezelevel)) ||
(OrderType () == OP_SELL && (use_sl - MarketInfo (OrderSymbol (), MODE_ASK) < d_freezelevel || MarketInfo (OrderSymbol (), MODE_ASK) - use_tp < d_freezelevel)))
{
Print ("Couldn''t modify order ", tick, " because its level is too close to the price") ;
return (-2) ;
}*/
int ms = GetTickCount () ;
Print ("Attempt #", attempt, " to modify market order ", tick, " to stoploss ", DoubleToStr (use_sl, Digits), " and takeprofit ", DoubleToStr (use_tp, Digits)) ;
result = OrderModify (tick, OrderOpenPrice (), use_sl, use_tp, 0) ;
if (! result)
{
errors ++ ;
int err = GetLastError () ;
switch (ErrorBlock (err, ms))
{
case 0: // continue
break ;
case 1: // wait and continue
Sleep (wait_error) ;
break ;
case 2: // terminate
return (-1) ;
}
}
else
{
errors = 0 ;
Print ("Order successfully modified in ", GetTickCount () - ms, " ms") ;
}
if (errors > max_errors)
{
Print ("Exceeded maximum errors count while trying to send trading command.") ;
Print ("To continue you should restart terminal or the EA") ;
return (-1) ;
}
attempt ++ ;
if (attempt > command_attempts && ! result)
{
return (-1) ;
}
}
return (1) ;
}
int PendingSend (int type, double lots, double price, double stop, double take, int magic_number, string comm)
{
if (type < 2 || type > 5)
{
Print ("Error in type of pending order!") ;
return (-3) ;
}
bool price_err = false, sltp_err = false ;
RefreshRates () ;
double use_sl = 0, use_tp = 0 ;
if (stop > 0 && stop < d_stoplevel)
{
Print ("Stoploss for sending pending order is lesser that stops level!") ;
return (-3) ;
}
if (take > 0 && take < d_stoplevel)
{
Print ("Takeprofit for sending pending order is lesser that stops level!") ;
return (-3) ;
}
switch (type)
{
case OP_BUYLIMIT:
if (Ask - price < d_stoplevel)
{
price_err = true ;
}
if (stop != 0)
{
if (stop > 0)
{
use_sl = price - stop ;
}
else
{
use_sl = -stop ;
if (price - use_sl < d_stoplevel)
{
Print ("Stoploss for sending pending order is lesser that stops level!") ;
return (-3) ;
}
}
}
if (take != 0)
{
if (take > 0)
{
use_tp = price + take ;
}
else
{
use_tp = -take ;
if (use_tp - price < d_stoplevel)
{
Показано первые 50% кода (символов: 21436)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.