setpendinggridlimit.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «setpendinggridlimit.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Скрипт для MetaTrader 4, предназначенный для серийного размещения отложенных ордеров (BuyLimit, BuyStop, SellLimit, SellStop) на торговом счёте. При запуске определяет тип ордера на основе параметра Direction и соотношения текущей цены с ценой первого ордера, затем последовательно выставляет заданное количество ордеров с фиксированным расстоянием между ними в пунктах.
Встроена система повторных попыток отправки ордеров при занятости торгового контекста, а также циклическая проверка появления ордера в истории для предотвращения дублирования позиций. После успешной отправки каждого ордера выполняется попытка установки стоп-лосса и тейк-профита с повторными попытками при модификации.
Скрипт использует оповещения (Alert) о ходе размещения и ошибках, корректирует величину проскальзывания в зависимости от торгового инструмента, применяет магический номер для идентификации ордеров и поддерживает пользовательский комментарий к каждому ордеру.
Настройки программы
| Настройка | Описание |
|---|---|
| gen | Общие настройки — Группа общих параметров |
| Lot | Объём лота — Размер лота для каждого размещаемого отложенного ордера |
| bos | Направление — Группа параметров направления (1=BUY, 2=SELL) |
| Direction | Направление ордера — Направление ордера: 1 — покупка (BuyLimit/BuyStop), 2 — продажа (SellLimit/SellStop) |
| PendingPriceFirstOrder | Цена первого ордера — Цена первого отложенного ордера; если установлена в 0, рассчитывается автоматически на основе расстояния в пунктах |
| NumberOfPendingsToSet | Количество ордеров — Количество отложенных ордеров, которые будут размещены при запуске скрипта |
| DistanceOrdersPips | Расстояние между ордерами (пипсы) — Расстояние между отложенными ордерами, задаваемое в пунктах |
| MagicNumber | Магический номер — Магический номер для идентификации ордеров, размещённых скриптом |
| TradeComment | Комментарий ордера — Комментарий, присваиваемый каждому размещаемому ордеру |
Поиск по коду файла
#property strict
#property show_inputs
#include <stdlib.mqh>
#define NL "\n"
#define slm " stop loss modification failed with error "
#define tpm " take profit modification failed with error "
extern string gen="----General inputs----";
extern double Lot = 0.01;
extern string bos="----Direction 1=BUY 2=SELL----";
extern int Direction=1;
extern double PendingPriceFirstOrder=0;
extern int NumberOfPendingsToSet=5;
extern double DistanceOrdersPips=20;
extern int MagicNumber=12345;
extern string TradeComment="PendingScript";
double MaxSlippagePips=5;
double factor;
int orderType;
double buffer=5;
int O_R_Setting_max_retries = 10;
double O_R_Setting_sleep_time = 4.0; /* seconds */
double O_R_Setting_sleep_max = 15.0; /* seconds */
int RetryCount = 10;//Will make this number of attempts to get around the trade context busy error.
int OnInit(void)
{
// код доступен только после оплаты
}
void OnStart()
{
// код доступен только после оплаты
}
int GetPipFactor(string symbol) {
static const string factor100[] = {"JPY","XAG","SILVER","BRENT","WTI"};
static const string factor10[] = {"XAU","GOLD","SP500"};
static const string factor1[] = {"UK100","WS30","DAX30","NAS100","CAC400"};
int xFactor = 10000; // correct xFactor for most pairs
for ( int j = 0; j < ArraySize( factor100 ); j++ ) {
if ( StringFind( symbol, factor100[j] ) != -1 ) xFactor = 100;
}
for ( int j = 0; j < ArraySize( factor10 ); j++ ) {
if ( StringFind( symbol, factor10[j] ) != -1 ) xFactor = 10;
}
for ( int j = 0; j < ArraySize( factor1 ); j++ ) {
if ( StringFind( symbol, factor1[j] ) != -1 ) xFactor = 1;
}
return (xFactor);
}
void ReportError(string function, string message)
{
int err=GetLastError();
Alert(WindowExpertName(), " ", OrderTicket(), function, message, err,": ",ErrorDescription(err));
Print(WindowExpertName(), " ", OrderTicket(), function, message, err,": ",ErrorDescription(err));
}//void ReportError()
bool SendSingleTrade(int type, string comment, double lotsize, double Price, double SL, double TP)
{
int ticket=-1;
double slippage = MaxSlippagePips *( MathPow(10, Digits) / factor);
color col = Red;
if (type == OP_BUY || type == OP_BUYSTOP) col = Green;
int expiry = 0;
for (int cc = 0; cc < RetryCount; cc++)
{
while(IsTradeContextBusy()) Sleep(100);//Put here so that excess slippage will cancel the trade if the ea has to wait for some time.
ticket = OrderSend(Symbol(),type, lotsize, Price, int(slippage), 0, 0, comment, MagicNumber, expiry, col);
if (ticket > -1)
{
ModifyOrder(ticket, SL, TP);
}//if (ticket > 0)}
if (ticket > -1) break;//Exit the trade send loop
if (cc == RetryCount - 1) return(false);
if (ticket < 0)
{
string stype;
if (type == OP_BUY) stype = "OP_BUY";
if (type == OP_SELL) stype = "OP_SELL";
if (type == OP_BUYLIMIT) stype = "OP_BUYLIMIT";
if (type == OP_SELLLIMIT) stype = "OP_SELLLIMIT";
if (type == OP_BUYSTOP) stype = "OP_BUYSTOP";
if (type == OP_SELLSTOP) stype = "OP_SELLSTOP";
int err=GetLastError();
Alert(Symbol(), " ", WindowExpertName(), " ", stype," order send failed with error(",err,"): ",ErrorDescription(err));
Print(Symbol(), " ", WindowExpertName(), " ", stype," order send failed with error(",err,"): ",ErrorDescription(err));
return(false);
}//if (ticket < 0)
}//for (int cc = 0; cc < RetryCount; cc++);
bool TradeReturnedFromCriminal = false;
while (!TradeReturnedFromCriminal)
{
TradeReturnedFromCriminal = O_R_CheckForHistory(ticket);
if (!TradeReturnedFromCriminal)
{
Alert(Symbol(), " sent trade not in your trade history yet. Keep an eye open in caseПоказано первые 50% кода (символов: 8379)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.