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

wsb silver.mq4

Похожие материалы по тегам

pro +.pineTradingView · 3 общих теговofada_gold_trader_v230.mq5MQL5 / MetaTrader 5 · 3 общих теговmulti strategy algo combined by enigma mode.pineTradingView · 3 общих теговmelona ob strategy 6th update (by 3dots).pineTradingView · 3 общих теговsmc+ict+indicators+scalping master.pineTradingView · 3 общих теговpremium_super_scalping killer algo.pineTradingView · 3 общих тегов
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Этот исходник представляет собой торговый советник для MetaTrader 4, написанный на MQL4. Советник работает с рыночными и торговыми событиями терминала: обрабатывает тики, таймер, события графика, а также выполняет торговые операции через торговые функции платформы. В коде присутствует защитный модуль с проверкой статуса лицензии, влияющий на возможность открытия ордеров.

Логика построена вокруг сеточной торговли: советник может открывать первые ордера по направлению, а затем добавлять усредняющие ордера при движении цены против позиции. Предусмотрены настройки управления лотом, шагом между ордерами, тейкпрофитом, трейлинг-стопом, а также ограничения на количество ордеров и работу по времени. Отдельные блоки настроек отвечают за так называемую «сушку» — временное запрещение открытия первых ордеров, и за запреты на открытие ордеров по просадке, уровню маржи и спреду.

Советник поддерживает фильтры входа: свечной анализ и сигналы индикаторов (MACD, CCI, Stochastic, RSI, Bollinger Bands, Ichimoku, скользящие средние). Также реализованы виртуальный тейкпрофит, отложенные лимитные ордера, ручные сессии ордеров и информационная панель на графике. Все перечисленные возможности подтверждаются кодом, однако конкретные условия срабатывания и внутренние расчёты здесь не раскрываются.

Настройки программы

НастройкаОписание
NewCycle Разрешает открытие первых ордеров; при выключении включается «сушка».
Balance Значение баланса, при достижении которого включается «сушка» и торговля по паре останавливается.
DDPara Просадка пары в процентах, при достижении которой включается «сушка» по всем парам.
DryTrallOf Отключает трейлинг-стоп при активной «сушке».
ZapretDD Включает запрет открытия ордеров при достижении заданной просадки по паре.
ZapretDDV Просадка пары в процентах, при которой запрещается открытие ордеров; значение 100 отключает запрет.
ZapretMG Включает запрет открытия ордеров при снижении уровня маржи ниже заданного.
ZapretMGV Уровень маржи в процентах, ниже которого запрещается открытие ордеров.
ZapretSP Включает запрет открытия ордеров при превышении заданного размера спреда.
ZapretSPV Размер спреда в пунктах, выше которого запрещается открытие ордеров.
CloseBuy При включении закрывает все ордера BUY и запрещает открытие первых ордеров BUY.
CloseSell При включении закрывает все ордера SELL и запрещает открытие первых ордеров SELL.
DrawdounCloseEnable Включает закрытие направления при достижении заданной просадки.
Drawdoun Просадка направления в процентах, при достижении которой закрываются ордера этого направления.
MondayFridayEnable Включает ограничение торговли по времени в понедельник и пятницу.
Start_Monday Час начала торговли в понедельник.
Finish_Friday Час в пятницу, после которого включается «сушка» до конца дня.
Finish_FridayTP Час в пятницу, после которого тейкпрофит уменьшается до пятничного значения.
TakeFriday Значение тейкпрофита в пунктах, применяемое в пятницу после заданного часа.
TimeEnable Включает ограничение торговли по времени в течение дня.
Start_Hour Час начала торговли в течение дня.
Finish_Hour Час окончания торговли в течение дня.
LotBuy Стартовый лот для первых ордеров BUY.
LotSell Стартовый лот для первых ордеров SELL.
MaxLot Максимально допустимый лот для одного ордера.
LotExponent Множитель лота, применяемый при увеличении объёма усредняющих ордеров.
OrdersCount Количество ордеров, после которого начинает применяться множитель лота.
SmartLotEnable Включает режим Smart-лота, который имеет приоритет при расчёте лота и открытии ордеров.
SmartLotOrdCount Количество ордеров, после которого активируется режим Smart-лота.
BY_pips Расстояние в пунктах от текущей цены до уровня безубытка, используемое при расчёте лота для усредняющих ордеров в режиме Smart-лота.
SmartPipStep Шаг между Smart-ордерами в пунктах.
SmartPipStepX Множитель шага между Smart-ордерами.
MM Включает автоматический расчёт лота от баланса счёта с использованием делителя.
Divider Делитель, используемый при автоматическом расчёте лота от баланса счёта.
TakeProfitBuy Базовый тейкпрофит для ордеров BUY в пунктах.
TakeProfitSell Базовый тейкпрофит для ордеров SELL в пунктах.
TakeProfitExpCount Количество ордеров, после которого тейкпрофит увеличивается на заданный коэффициент.
TakeProfitExp Коэффициент увеличения тейкпрофита после заданного количества ордеров.
TakeProfitVirt Включает виртуальный тейкпрофит, контролируемый советником без установки на сервере.
ShowLinesTP Показывает на графике уровни виртуальных тейкпрофитов.
ShowLinesTPArr Показывает цену рядом с уровнями виртуальных тейкпрофитов.
UseTrailingStop Включает использование трейлинг-стопа.
UseTrailingStopOrd Количество ордеров, начиная с которого применяется трейлинг-стоп.
UseTrailingStopArr Показывает цену рядом с уровнями трейлинг-стопа.
TrailStart Расстояние в пунктах, после которого активируется трейлинг-стоп.
TrailStop Расстояние в пунктах, на котором подтягивается стоп-лосс при трейлинге.
LIMIT_ENABLE Включает использование отложенных лимитных ордеров при усреднении.
LIMIT_COUNT_ENABLE Количество ордеров, после которого начинают использоваться отложенные лимитные ордера.
ModeLimits Режим расчёта лота для отложенных лимитных ордеров: как раньше, увеличение по шагу или увеличение по мартину.
LIMIT_PIPS Отступ отложенного лимитного ордера от текущей цены в пунктах.
PipStep Базовый шаг между усредняющими ордерами в пунктах.
PipStepX Множитель шага между усредняющими ордерами.
MaxTrades Максимальное количество ордеров одного направления.
OrdersSesEnableBuy Включает ручную сессию ордеров BUY.
OrdersSesEnableBuyOff Количество ордеров, после которого ручная сессия BUY отключается.
OrdersSesCountBuy Количество ордеров в одной ручной сессии BUY.
OrdersSesStepBuy Шаг между сессиями ордеров BUY в пунктах.
OrdersSesEnableSell Включает ручную сессию ордеров SELL.
OrdersSesEnableSellOff Количество ордеров, после которого ручная сессия SELL отключается.
OrdersSesCountSell Количество ордеров в одной ручной сессии SELL.
OrdersSesStepSell Шаг между сессиями ордеров SELL в пунктах.
PriceActionType Тип свечного анализа: ручной (постоянный) или автоматический (динамический).
PriceActionDD Просадка в процентах, при достижении которой включается свечной анализ в автоматическом режиме.
PriceAction1 Включает свечной анализ для первых ордеров в ручном режиме.
PriceAction2 Включает свечной анализ для усредняющих ордеров в ручном режиме.
BarsTF Таймфрейм баров, используемый для свечного анализа при принятии решения об открытии ордеров.
IndEnable_1 Включает использование сигналов индикаторов для открытия первых ордеров.
IndEnable_2 Включает использование сигналов индикаторов для открытия усредняющих ордеров.
IndEnable_2OrdCount Количество ордеров, до достижения которого сигналы индикаторов для усредняющих ордеров игнорируются.
MagicNumber Уникальный идентификатор (Magic) ордеров и позиций советника.
chartDisplay Включает отображение информационной панели на графике.
Style Включает оформление и отображение логотипа советника на графике.
Получить полный код

Поиск по коду файла

#define VERSION "1.00"
#property strict

#ifdef LOGO_FILE
#resource "\\Images\\silver_logo.bmp"
#endif

#define LOGO_MIN 1555
#define LOGO_MAX 1555

#define TextColor clrGold

#include <sovetnikovNET\Orders.mqh>
#include <sovetnikovNET\Time.mqh>

#include <Indicators/Trend.mqh>
#include <Indicators/Oscilators.mqh>

#include <sovetnikovNET\Image.mqh>

class CMyLogo: public CMyImage
  {
public:
   virtual void              Center(int min,int max)
     {

      if(m_lastW!=ChartWidth() || m_lastH!=ChartHeight())
        {
         m_lastW=ChartWidth();
         m_lastH=ChartHeight();

         int w=m_lastH;
         if(w<min)
            w=min;

         if(w>max)
            w=max;

         int x=m_lastW/2;
         int y=m_lastH/2;

         ResizeImage(w);

         Move(x,y);

         m_img.SetInteger(OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);

         canvasMain.Update();
        }
     }
  };

CMyLogo logo;

#define LICENSE_OFF

#define LICENSE_PANEL
#property version   VERSION
const int ADMIN_ID=38;
const int PRODUCT_ID=64;//Silver.Pro
#include <EA_Protect/Protect.mqh>
SHOW_LICENSE_PARAMS
PROTECT_CREATE

#define COLOR_FON C'0x23,0x2d,0x37'

enum enum_hour
  {
   H00,//00
   H01,//01
   H02,//02
   H03,//03
   H04,//04
   H05,//05
   H06,//06
   H07,//07
   H08,//08
   H09,//09
   H10,//10
   H11,//11
   H12,//12
   H13,//13
   H14,//14
   H15,//15
   H16,//16
   H17,//17
   H18,//18
   H19,//19
   H20,//20
   H21,//21
   H22,//22
   H23 //23
  };

enum enum_limit_mode
  {
   limit_mode_default, //Как раньше
   limit_mode_bystep, //Увеличение лотности по шагу
   limit_mode_bymartin //Увеличение лотности по мартину
  };

enum enum_candle_mode
  {
   candle_mode_manual=1, //Ручной режим (постоянный)
   candle_mode_auto=2, //Автоматический режим (динамический)
  };

GROUP(1,"------------------------------------");//Сушка (запрет первых)
B NewCycle=true; //Разрешить первые ордера (СУШКА при false)
D Balance=0.0; //Баланс для сушки и остановки торговли на паре
D DDPara=20.0; //Просадка (%) пары для включения сушки по всем парам
B DryTrallOf=true; //Отключать трейлингстоп при сушке
GROUP(2,"------------------------------------");//Запрет первых и усредняющих
B ZapretDD=false; //Просадка по паре
D ZapretDDV=100.0; //Просадка (%) пары для запрета ордеров (100 - выключен)
B ZapretMG=false; //По марже
D ZapretMGV=500.0; //Уровень маржи (%) ниже будет запрет открытия ордеров
B ZapretSP=false; //По спреду
D ZapretSPV=5.0; //Размер спреда (пункты) выше будет запрет открытия ордеров
GROUP(3,"------------------------------------");//Закрытие ордеров
B CloseBuy=false; //Закрыть все ордера BUY и запретить первые
B CloseSell=false; //Закрыть все ордера SELL и запретить первые
B DrawdounCloseEnable=false; //Включить закрытие направления по просадке
D Drawdoun=100.0; //Просадка (%) направления для закрытия ордеров направления
GROUP(4,"------------------------------------");//Понедельник и пятница
B MondayFridayEnable=true; //Торговля по времени в понедельник и Пятницу
input enum_hour Start_Monday=2; //Начать в Понедельник (часы)
input enum_hour Finish_Friday=16; //Закончить в Пятницу (часы)
input enum_hour Finish_FridayTP=16; //Уменьшить в Пятницу Тейкпрофит (часы)
D TakeFriday=4;//пятничный Тейкпрофит (пункты)
GROUP(5,"------------------------------------");//Время торговли
B TimeEnable=true; //Торговля по времени в течении дня
input enum_hour Start_Hour=2; //Начало торговли (часы)
input enum_hour Finish_Hour=22; //Конец торговли (часы)
GROUP(6,"------------------------------------");//Лот
D LotBuy=0.01; //Стартовый лот BUY
D LotSell=0.01; //Стартовый лот SELL
D MaxLot=0.5; //Максимальный лот ордера
D LotExponent=1.5; //Множитель лота
I OrdersCount=6; //Кол-во ордеров до мартина
GROUP(7,"------------------------------------");//Smart лот
B SmartLotEnable=true; //Smart лот включить

I SmartLotOrdCount=6; //Smart лот после Х ордера
D BY_pips=5;//БУ в Х пунктах от тек. цены(по возможности)
D SmartPipStep=3.0;//Шаг м/у Smart ордерами в пунктах
D SmartPipStepX=1.0; //Множитель шага м/у Smart ордерами
GROUP(8,"------------------------------------");//Авторасчет лота
B MM=false;//ММ
D Divider=10.0;//Divider
GROUP(9,"------------------------------------");//Тейкпрофит
D TakeProfitBuy=5; //Тейкпрофит BUY в пунктах
D TakeProfitSell=5; //Тейкпрофит SELL в пунктах
D TakeProfitExpCount=1; //Увеличить размер ТП на коэффициент после Х ордера
D TakeProfitExp=1.0;//Коэффициент увеличения ТП
B TakeProfitVirt=false; //Тейкпрофит виртуальный
B ShowLinesTP=false;//Уровни виртуальных ТП
B ShowLinesTPArr=false;//Показать цену у уровней
GROUP(10,"------------------------------------");//Трейлингстоп
B UseTrailingStop=false; //Использовать Трейлингстоп
I UseTrailingStopOrd=1;//Использовать Трейлингстоп с Х ордера
B UseTrailingStopArr=true;//Показать цену у уровней
D TrailStart=10.0;//Активация трейлингстоп черех Х пунктов
D TrailStop=5.0;//Подтягивать стоплосс на расстоянии Х пунктов
GROUP(11,"------------------------------------");//Ордера
B LIMIT_ENABLE=false; //Включить лимитники
I LIMIT_COUNT_ENABLE=1; //Включить лимитники после Х ордера
input enum_limit_mode ModeLimits=1; //Режим лимитников
D LIMIT_PIPS=3;//Отступ лимитника от текущей цены
D PipStep=3.0; //Шаг м/у ордерами в пунктах
D PipStepX=1.0; //Множитель шага м/у ордерами
I MaxTrades=30; //Максимальное кол-во ордеров одного направления
GROUP(12,"------------------------------------"); //Сессии ордеров
B OrdersSesEnableBuy=true; //Включить ручную сессию ордеров BUY
I OrdersSesEnableBuyOff=15;//Отключить сессию BUY после Х ордера
I OrdersSesCountBuy=6;//Кол-во ордеров одной сессии BUY
D OrdersSesStepBuy=50.0; //Шаг м/у сессиями ордеров BUY
GROUP(13,"------------------------------------"); //---
B OrdersSesEnableSell=true; //Включить ручную сессию ордеров SELL
I OrdersSesEnableSellOff=15;//Отключить сессию SELL после Х ордера
I OrdersSesCountSell=6;//Кол-во ордеров одной сессии SELL
D OrdersSesStepSell=50.0; //Шаг м/у сессиями ордеров SELL
GROUP(14,"------------------------------------");//Свечной анализ
input enum_candle_mode PriceActionType=candle_mode_manual; //Тип свечного анализа
D PriceActionDD=0.0; //Просадка для включения свечного анализа (Автоматический режим)
B PriceAction1=false;//Свечной анализ первых ордеров (Ручной режим)
B PriceAction2=true;//Свечной анализ усредняющих ордеров (Ручной режим)
TF BarsTF=5;//Таймфрейм баров для свечного анализа
GROUP(15,"------------------------------------");//Сигналы индикаторов
B IndEnable_1=false;//Сигналы индикаторов для первых ордеров
B IndEnable_2=true;//Сигналы индикаторов для усредняющих ордеров
I IndEnable_2OrdCount=6; //Сигналы индикаторов усредняющих после Х ордера
GROUP(16,"------------------------------------");//--------------
I MagicNumber=777;//Magic номер советника
B chartDisplay=true;//Показывать инфопанель
B Style=true;//Дизайн

int slippage=0;

CGlobal m_global;

/*
переменные для отображения
*/
CDrawPos m_pos;
double            m_symboldd=0,m_buydd=0,m_selldd=0,m_fulldd=0,m_balance=0;
double            m_symbolpdd=0,m_buypdd=0,m_sellpdd=0,m_fullpdd=0;
double            m_lots[2]= {0,0};
int               m_counts[2]= {0,0};
double            m_day=0,m_last=0,m_week=0,m_month=0,m_total=0;
bool              m_dry=false;

void Draw_OnInit()
  {

   m_day=0;
   m_last=0;
   m_week=0;
   m_month=0;
   m_total=0;

   m_buydd=m_selldd=m_fulldd=m_symboldd=0;
   m_buypdd=m_sellpdd=m_fullpdd=m_symbolpdd=0;
   m_balance=0;
   m_dry=false;

#ifdef LOGO_FILE
   if(Style)
      logo.Load(0,LOGO_FILE,0,0,true);
#endif

   if(AccountBalance()==0 || !chartDisplay)
      return;

   int ifont=(int)toDPI(12);
   int x1=7,x2=190,x3=280;

   int ioffset=14;

   m_pos.OnInit("panel",286,208,CORNER_RIGHT_UPPER);
   m_pos.Update(5,20);

   m_pos.DrawRectLabel(0,"fon",COLOR_FON,CORNER_LEFT_UPPER,0,0,286,208);
   m_pos.Add("fon",0,0,ifont,COLOR_FON,ANCHOR_LEFT_UPPER);
   int y=2;
   m_pos.Add("Всего",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("Всего значение 1",x2,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("Сушка",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);
   y+=ioffset;
   m_pos.Add("За месяц",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("За месяц значение 1",x2,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("За месяц значение 2",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);
   y+=ioffset;
   m_pos.Add("За неделю",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("За неделю значение 1",x2,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("За неделю значение 2",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("Вчера",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("Вчера значение 1",x2,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("Вчера значение 2",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("Сегодня",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("Сегодня значение 1",x2,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("Сегодня значение 2",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("separator1",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("Баланс",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("Баланс значение",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("Эквити",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("Эквити значение",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("В торговле",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("В торговле значение 1",x2,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("В торговле значение 2",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("separator2",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("BUY",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("BUY значение",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("SELL",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("SELL значение",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("separator3",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);

   y+=ioffset;
   m_pos.Add("SUM",x1,y,ifont,TextColor,ANCHOR_LEFT_UPPER,"Century Gothic",FW_THIN);
   m_pos.Add("SUM значение",x3,y,ifont,TextColor,ANCHOR_RIGHT_UPPER,"Century Gothic",FW_THIN);

   m_pos.Update(5,20);

   Draw_OnTimer(); //первый запуск, выведем текст

  }

void Draw_OnDeinit()
  {
   logo.OnDeinit();
   m_pos.OnDeinit();
  }

void Draw_OnTimer()
  {
   if(AccountBalance()==0 || !chartDisplay)
      return;
   double dprofit=ND2(AccountEquity()-AccountBalance());

   m_pos.Text("Всего","Всего:");
   m_pos.Text("Всего значение 1",StringFormat("%.2f $",m_total));
   m_pos.Text("Сушка",StringFormat("%s",m_dry?"Сушка":""));

   m_pos.Text("За месяц","За месяц:");
   m_pos.Text("За месяц значение 1",StringFormat("%.2f $",m_month));
   m_pos.Text("За месяц значение 2",StringFormat("%.2f %%",ND2(m_month*100/AccountBalance())));

   m_pos.Text("За неделю","За неделю:");
   m_pos.Text("За неделю значение 1",StringFormat("%.2f $",m_week));
   m_pos.Text("За неделю значение 2",StringFormat("%.2f %%",ND2(m_week*100/AccountBalance())));

   m_pos.Text("Вчера","Вчера:");
   m_pos.Text("Вчера значение 1",StringFormat("%.2f $",m_last));
   m_pos.Text("Вчера значение 2",StringFormat("%.2f %%",ND2(m_last*100/AccountBalance())));

   m_pos.Text("Сегодня","Сегодня:");
   m_pos.Text("Сегодня значение 1",StringFormat("%.2f $",m_day));
   m_pos.Text("Сегодня значение 2",StringFormat("%.2f %%",ND2(m_day*100/AccountBalance())));
   m_pos.Text("separator1","============================");

   m_pos.Text("Баланс","Баланс:");
   m_pos.Text("Баланс значение",StringFormat("%.2f $",m_balance));

   m_pos.Text("Эквити","Эквити:");
   m_pos.Text("Эквити значение",StringFormat("%.2f $",AccountEquity()));

   m_pos.Text("В торговле","В торговле:");
   m_pos.Text("В торговле значение 1",StringFormat("%.2f $",m_fulldd));
   m_pos.Text("В торговле значение 2",StringFormat("%.2f %%",m_fullpdd));
   m_pos.Text("separator2","============================");

   m_pos.Text("BUY","BUY:");
   m_pos.Text("BUY значение",StringFormat("%d | %.2f | %.2f$ %.2f%%",m_counts[OP_BUY],m_lots[OP_BUY],m_buydd,m_buypdd));

   m_pos.Text("SELL","SELL:");
   m_pos.Text("SELL значение",StringFormat("%d | %.2f | %.2f$ %.2f%%",m_counts[OP_SELL],m_lots[OP_SELL],m_selldd,m_sellpdd));
   m_pos.Text("separator3","============================");

   m_pos.Text("SUM","SUM:");
   m_pos.Text("SUM значение",StringFormat("%d | %.2f | %.2f$ %.2f%%",m_counts[OP_BUY]+m_counts[OP_SELL],m_lots[OP_BUY]+m_lots[OP_SELL],m_symboldd,m_symbolpdd));

   m_pos.Update(5,20);

  }

class CMyOrders: public COrders
  {
public:
   CiMACD            macd;
   CiCCI             cci;
   CiStochastic      stoh;
   CiRSI             rsi;
   CiBands           bb;
   CiIchimoku        ichi;
   CiMA              ma1,ma2;

   virtual bool      OnInitIndicators()
     {
      /*
         MACD 8 17 9
               CCI 13
               Stoch 5 3 3
               RSI 14
               BB 20 2
               Ichimoku 9 26 52
               Ma1+Ma2 (5 и 9)
         */
      if(!macd.Create(_Symbol,PERIOD_M5,8,17,9,PRICE_CLOSE))
         INDICATOR_ERROR("MACD");

      if(!cci.Create(_Symbol,PERIOD_M5,13,PRICE_CLOSE))
         INDICATOR_ERROR("CCI");

      if(!stoh.Create(_Symbol,PERIOD_M5,5,3,3,MODE_SMA,STO_LOWHIGH))
         INDICATOR_ERROR("Stochastic");

      if(!rsi.Create(_Symbol,PERIOD_M5,14,PRICE_CLOSE))
         INDICATOR_ERROR("RSI");

      if(!bb.Create(_Symbol,PERIOD_M5,20,0,2,PRICE_CLOSE))
         INDICATOR_ERROR("BBands");

      if(!ichi.Create(_Symbol,PERIOD_M5,9,26,52))
         INDICATOR_ERROR("Ichimoku");

      if(!ma1.Create(_Symbol,PERIOD_M5,5,0,MODE_EMA,PRICE_CLOSE))
         INDICATOR_ERROR("MA1");

      if(!ma2.Create(_Symbol,PERIOD_M5,9,0,MODE_EMA,PRICE_CLOSE))
         INDICATOR_ERROR("MA2");

      Print("Init signals success");
      return true;
     }

   virtual bool      OnDeinitIndicators()
     {
      return true;
     }

   void              Signal(bool &buysignal,bool &sellsignal)
     {
      buysignal=false;
      sellsignal=false;

      if(rsi.Main(0)>=70 &&
         stoh.Main(0)>=80 &&
         cci.Main(0)>=100 &&
         macd.Main(0)>0 &&
         _Ask>bb.Upper(0) &&
         ma1.Main(0)>ma2.Main(0) &&
         _Ask>MathMax(ichi.SenkouSpanA(0),ichi.SenkouSpanB(0)) &&
         _Ask>ichi.TenkanSen(0) &&
         _Ask>ichi.KijunSen(0))
         buysignal=true;

      if(rsi.Main(0)<=30 &&
         stoh.Main(0)<=20 &&
         cci.Main(0)<=-100 &&
         macd.Main(0)<0 &&
         _Bid<bb.Lower(0) &&
         ma1.Main(0)<ma2.Main(0) &&
         _Bid<MathMin(ichi.SenkouSpanA(0),ichi.SenkouSpanB(0)) &&
         _Bid<ichi.TenkanSen(0) &&
         _Bid<ichi.KijunSen(0))
         sellsignal=true;
      /*м5 сигналы!

      sell:
      rsi выше 70
      стохастик - главная выше сигнальной и выше 80
      сси - выше 100
      макд гистограмма в +
      бб - выше верхней границы
      ма 5 выше ма 9
      ичимоку - выше всех линий

      buy:
      rsi - ниже 30
      стохастик главная ниже сигнальной и ниже 20
      сси - ниже -100
      макд - гистограмма в -
      бб - ниже нижней границы
      ма 5 ниже ма 9
      ичимоку ниже всех линий*/
     }

   void              trailing_pending(double dnewlot,double doffset,double dstep=0,int itype=-1)//трейлинг стоп стандартный
     {

      if(doffset==0.0)
         return;

      double dstop=0,dtake=0,dopen=0,dprice=0,dStep=dstep,dlot=0;
      string _cmt="";
      ENUM_ORDER_TYPE type;
      ulong iticket=0;

      m_symbol.Name(m_name);
      double dtick=m_symbol.TickSize();

      if(dStep==0)
         dStep=m_symbol.NormalizePrice(dtick/m_symbol.Point());

      int total=PendingOrdersTotal();

      for(int i=total-1; i>=0; i--)
        {
         if(!SelectByIndex(i,false))
            continue;

         iticket=m_order.Ticket();
         type=m_order.OrderType();

         dstop=m_order.StopLoss();
         dtake=m_order.TakeProfit();
         dopen=m_order.PriceOpen();
         _cmt=m_order.Comment();

         dlot=m_order.VolumeCurrent();

         if(type==ORDER_TYPE_BUY_STOP && (itype==OP_BUYSTOP || itype==-1))
           {
            dprice=m_symbol.NormalizePrice(MathFloor((m_symbol.Ask()+doffset*p)/dtick)*dtick);

            if(dprice<dopen && (dopen-dprice)/p>=dStep)
              {
               double dStepPending=nd(MathFloor(((dopen-dprice)/p)/dStep)*dStep,m_name);

               if(dStepPending>0)
                 {
                  if(dstop>0)
                     dstop-=dStepPending*p;
                  if(dtake>0)
                     dtake-=dStepPending*p;

                  dopen-=dStepPending*p;

                  if(dlot!=dnewlot)
                    {
                     if(this.OrderClose(iticket))
                       {
                        ulong tt=this.OrderSend(OP_BUYSTOP,dnewlot,dopen,dstop,dtake,_cmt,false);
                        DEBUG_OrderSend3(tt);
                       }
                    }
                  else
                    {
                     this.OrderModify(iticket,dopen,dstop,dtake);
                    }
                 }
              }

           }
         else
            if(type==ORDER_TYPE_SELL_STOP && (itype==OP_SELLSTOP || itype==-1))
              {
               dprice=m_symbol.NormalizePrice(MathFloor((m_symbol.Bid()-doffset*p)/dtick)*dtick);

               if(dprice>dopen && (dprice-dopen)/p>=dStep)
                 {
                  double dStepPending=nd(MathFloor(((dprice-dopen)/p)/dStep)*dStep,m_name);

                  if(dStepPending>0)
                    {
                     if(dstop>0)
                        dstop+=dStepPending*p;
                     if(dtake>0)
                        dtake+=dStepPending*p;

                     dopen+=dStepPending*p;

                     if(dlot!=dnewlot)
                       {
                        if(this.OrderClose(iticket))
                          {
                           ulong tt=this.OrderSend(OP_SELLSTOP,dnewlot,dopen,dstop,dtake,_cmt,false);
                           DEBUG_OrderSend3(tt);
                          }
                       }
                     else
                       {
                        this.OrderModify(iticket,dopen,dstop,dtake);
                       }
                    }
                 }

              }

        }
     }

   double            getProfits(double &dprofit_buy,double &dprofit_sell,datetime tmhistory=0,long imagic=-1)
     {
      double dtotal=0;
      dprofit_buy=0;
      dprofit_sell=0;

      int itotal=PositionsTotal();

      for(int i=itotal-1; i>=0; i--)
        {
         if(!m_position.SelectByIndex(i))
            continue;

         if(m_position.Magic()==imagic)
           {

            if(m_position.Time()>=tmhistory)
              {
               dtotal+=m_position.Profit()+m_position.Swap()+m_position.Commission();

               if(m_position.Symbol()==m_name && m_position.PositionType()==POSITION_TYPE_BUY)
                 {
                  dprofit_buy+=m_position.Profit()+m_position.Swap()+m_position.Commission();
                 }
               if(m_position.Symbol()==m_name && m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  dprofit_sell+=m_position.Profit()+m_position.Swap()+m_position.Commission();
                 }
              }
           }
        }

      return dtotal;

     }

   virtual void      SetAll_AverageTrailing(int etype,double dTakeProfit,double dTrailingStart,double dTrailingStop,double dTrailingStep,bool bModify)
     {

      bool bTral=true;
      if(dTrailingStart==0)
         bTral=false;

      if(!bModify)
        {
         bModify=IsNewDay();
        }

      if((bModify || bTral))
        {
         int idirect=0;
         double davg=get_Average(etype,idirect);

         if(etype==OP_BUY && idirect==1 && davg>0)
           {

            double dstop=-1;
            if(dTrailingStart>0)
              {

               if(Bid(m_name)-dTrailingStart*p>=davg)
                 {
                  dstop=Bid(m_name)-dTrailingStop*p;
                  m_drawvirtual.Delete(0,"tsbuy_start");
                  m_drawvirtual.Delete(0,"tsbuy_stop");
                 }
               else
                 {
                  m_drawvirtual.DrawHLine(0,"tsbuy_start",0,Time[1],nd(davg+dTrailingStart*p),1,STYLE_DASH,clrBlue,false,true,"BUY Trailing Start",true);
                  m_drawvirtual.DrawHLine(0,"tsbuy_stop",0,Time[1],nd(davg+(dTrailingStart-dTrailingStop)*p),1,STYLE_DASH,clrBlue,false,true,"BUY Trailing Stop",true);
                 }
              }
            else
              {
               m_drawvirtual.Delete(0,"tsbuy_start");
               m_drawvirtual.Delete(0,"tsbuy_stop");
              }
            double dtake=0;
            if(dTakeProfit>0)
               dtake=davg+idirect*dTakeProfit*p;
            else
               dtake=0;

            if(ShowLinesTP)
              {
               if(dtake>0)
                  m_drawvirtual.DrawHLine(ChartID(),"tpbuy",0,Time[1],dtake,2,STYLE_SOLID,clrGreen,false,false,"TP BUY",true);
               else
                  m_drawvirtual.Delete(ChartID(),"tpbuy");
              }

            if(ShowLinesTPArr)
              {

Показано первые 50% кода (символов: 31462)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
3 146,20₽ ≈ $38.46