wsb silver.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «wsb silver.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Этот исходник представляет собой торговый советник для 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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.