← К каталогу
Исходный код · ID 605

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 и перейдите к оплате.

Стоимость полного кода
837,90₽ ≈ $10.24