SMART BOT SYSTEMS
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «anubis_sar_macd_v6.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
anubis_sar_macd_v6.mq4 — торговый советник для MetaTrader 4, реализованный на MQL4. Он работает на текущем символе, обрабатывает тики и таймерные события, использует рыночные данные и технические индикаторы для принятия торговых решений. В коде присутствует проверка номера счёта, при несоответствии работа советника блокируется и выводится комментарий.
Советник поддерживает торговлю в обе стороны (Buy и Sell), усреднение серии ордеров с настраиваемым шагом, управление лотом через риск или фиксированный начальный лот, а также несколько режимов трейлинга и безубытка. Реализованы функции перекрытия и частичного закрытия ордеров, сопровождение виртуальными стоп-ордерами и расширение шага после заданного колена.
Для расчёта сигналов используются индикаторы Parabolic SAR, скользящие средние и MACD, а также опциональный фильтр RSI. Настройки вынесены во входные параметры, включая отладочный вывод, графическую панель, управление сериями, риск-менеджмент, трейлинг, безубыток, перекрытие и параметры сигналов. Советник содержит вспомогательные функции для отрисовки объектов на графике, работы с историей ордеров и форматирования данных.
Настройки программы
| Настройка | Описание |
|---|---|
| . (v1) | Параметры индикации — Разделитель для параметров индикации. |
| Принты журнала (Debug) | Принты журнала — Включает вывод отладочных сообщений в журнал. |
| Грфические объекты (InfoChart) | Грфические объекты — Включает отображение графических объектов на графике. |
| Координата X панели (x_axis) | Координата X панели — Координата X для размещения панели. |
| Координата Y панели (y_axis) | Координата Y панели — Координата Y для размещения панели. |
| . (v1_) | Параметры индикации — Разделитель для параметров индикации. |
| . (v2) | Дополнительные параметры — Разделитель для дополнительных параметров. |
| Торговать Buy (TradeBuy) | Торговать Buy — Разрешает торговлю на покупку. |
| Торговать Sell (TradeSell) | Торговать Sell — Разрешает торговлю на продажу. |
| Открытие колен на новом баре (UseNewBar) | Открытие колен на новом баре — Включает открытие колен на новом баре. |
| Открытие колен по заданному тайм-фрейму (UNB_TF) | Открытие колен по заданному тайм-фрейму — Таймфрейм для открытия колен. |
| Префикс в названиях валютных пар. (Prefix) | Префикс в названиях валютных пар. — Префикс в названиях валютных пар. |
| Максимальное значение спреда (SpreadMax) | Максимальное значение спреда — Максимально допустимое значение спреда. |
| Магик номер (MagicNumber) | Магик номер — Магический номер для идентификации ордеров советника. |
| Серия после которой закрывается первый ордер (FirstClose) | Серия после которой закрывается первый ордер — Номер серии, после которой закрывается первый ордер. |
| . (v2__) | Дополнительные параметры — Разделитель для дополнительных параметров. |
| . (v3) | Установки риска и ММ — Разделитель для установок риска и ММ. |
| Risk если 0 то DefaultLot (Risk) | Risk если 0 то DefaultLot — Риск; если 0, используется DefaultLot. |
| Во сколько раз макс.лот в серии больше стартового (Kf_MaxLot) | Во сколько раз макс.лот в серии больше стартового — Во сколько раз максимальный лот в серии больше стартового. |
| Макс.лот если=0 -Kf_MaxLot (MaxLot) | Макс.лот если=0 -Kf_MaxLot — Максимальный лот; если 0, используется Kf_MaxLot. |
| Начальный лот,если Risk=0 (DefaultLot) | Начальный лот,если Risk=0 — Начальный лот, используемый при Risk=0. |
| Макс кол-во ордеров в серии (MaxTrades) | Макс кол-во ордеров в серии — Максимальное количество ордеров в серии. |
| . (v3_) | Установки риска и ММ — Разделитель для установок риска и ММ. |
| . (v4) | Установки лот экспоненты — Разделитель для установок лот экспоненты. |
| Тип лот экспоненты (TypeLotExp) | Тип лот экспоненты — Тип экспоненты для расчёта лота. |
| Коэффициент увеличения лота (LotExponent) | Коэффициент увеличения лота — Коэффициент увеличения лота для серии ордеров. |
| . (v4_) | Установки лот экспоненты — Разделитель для установок лот экспоненты. |
| . (v5) | Установки трейлинга и БУ — Разделитель для установок трейлинга и БУ. |
| Выбор трейлинга (TypeTrailing) | Выбор трейлинга — Выбор режима трейлинга. |
| . (v5_0) | Стандартный трейлинг — Разделитель для стандартного трейлинг стопа. |
| . (v5_1) | Стандартный трейлинг — Разделитель для стандартного трейлинг стопа. |
| Уровень прибыли для включения трейлинга (TrailingStart) | Уровень прибыли для включения трейлинга — Уровень прибыли в пунктах для включения трейлинга. |
| Уровень трейлинга (расстояние от текущей цены) (TrailingStop) | Уровень трейлинга (расстояние от текущей цены) — Расстояние трейлинга от текущей цены в пунктах. |
| Шаг трейлинга (TrailStep) | Шаг трейлинга — Шаг трейлинга в пунктах. |
| . (v5_2) | Трейлинг по барам — Разделитель для трейлинг стопа по барам. |
| Таймфрейм баров (BarsTF) | Таймфрейм баров — Таймфрейм, используемый для трейлинга по барам. |
| Кол-во баров отступа для SL-БУ (BarsUse) | Кол-во баров отступа для SL-БУ — Количество баров отступа для расчёта стоп-лосса и безубытка. |
| Кол-во пунктов отступа от экстримума (BarsOtstup_) | Кол-во пунктов отступа от экстримума — Количество пунктов отступа от экстремума для расчёта стоп-лосса. |
| . (v5_3) | Безубыток — Разделитель для безубытка. |
| Использовать безубыток (BuSeries) | Использовать безубыток — Включает использование безубытка для серии ордеров. |
| Профит в пунктах для установки БУ (BUstart) | Профит в пунктах для установки БУ — Профит в пунктах, при котором активируется безубыток. |
| Уровень безубытка в пунктах (BUsize) | Уровень безубытка в пунктах — Уровень безубытка в пунктах. |
| . (v5_) | Установки трейлинга и БУ — Разделитель для установок трейлинга и БУ. |
| . (v6) | Установки LastTral — Разделитель для установок ласт трала откусывателя. |
| № ордера который кусаем - 0 откл (LevelPartClose) | № ордера который кусаем - 0 откл — Номер ордера, который подвергается частичному закрытию; 0 — отключено. |
| № колена,начала работы LastTral - 0 откл (StartOrdLastTral) | № колена,начала работы LastTral - 0 откл — Номер колена, с которого начинается работа LastTral; 0 — отключено. |
| . (v6_) | Установки LastTral — Разделитель для установок ласт трала откусывателя. |
| . (v7) | Установки перекрытия — Разделитель для установок перекрытия ордеров. |
| Перекрытие ордеров (TypeOverlap) | Перекрытие ордеров — Включает перекрытие ордеров. |
| Маржа для вкл перекрытия если оно отключено (MargTypeOverlap) | Маржа для вкл перекрытия если оно отключено — Уровень маржи для включения перекрытия ордеров, если оно отключено. |
| Частичное перекрытие (PartOverlap) | Частичное перекрытие — Включает частичное перекрытие ордеров. |
| Маржа для вкл част-го перекрытия если оно отключено (MargPartOverlap) | Маржа для вкл част-го перекрытия если оно отключено — Уровень маржи для включения частичного перекрытия, если оно отключено. |
| . (v7_) | Установки перекрытия — Разделитель для установок перекрытия ордеров. |
| . (v8) | Параметры входа — Разделитель для параметров входа и сопровождения. |
| Шаг открытия колен (PipStep) | Шаг открытия колен — Шаг в пунктах для открытия следующего колена серии. |
| Сопровождение виртуальными стоп ордерами (Stop_order) | Сопровождение виртуальными стоп ордерами — Включает сопровождение виртуальными стоп-ордерами. |
| Начало трала отложенного ордера (TralStartPend) | Начало трала отложенного ордера — Начало трала отложенного ордера. |
| Шаг трала отложенного ордера (TralSizePend) | Шаг трала отложенного ордера — Шаг трала отложенного ордера. |
| Тип сигнала на усреднение (TypeUsr) | Тип сигнала на усреднение — Тип сигнала на усреднение. |
| Тип сигнала на вход (Type_Trade) | Тип сигнала на вход — Тип сигнала на вход. |
| . (st) | Параметры расширения шага — Разделитель для параметров расширения шага. |
| Колено после которого расширяется шаг (StartDynStep) | Колено после которого расширяется шаг — Колено, после которого шаг начинает расширяться. |
| Сколько добавлять к ПипСтепу (PipStepInc) | Сколько добавлять к ПипСтепу — Величина, добавляемая к шагу после расширения. |
| . (v8_) | Параметры входа — Разделитель для параметров входа и сопровождения. |
| . (v9) | Параметры сигналов — Разделитель для параметров расчёта сигнальщиков. |
| Использовать RSI фильтр (RSI_filtr) | Использовать RSI фильтр — Включает использование фильтра RSI. |
| Уровень buy (LevelBuy) | Уровень buy — Уровень RSI для сигнала на покупку. |
| Уровень sell (LevelSell) | Уровень sell — Уровень RSI для сигнала на продажу. |
| . (v9_) | Параметры сигналов — Разделитель для параметров расчёта сигнальщиков. |
| Таймфрейм сигнальщиков (TFsig) | Таймфрейм сигнальщиков — Таймфрейм для расчёта сигналов. |
| p_s | Настройки Parabolic SAR — Разделитель для настроек Parabolic SAR. |
| Коэффициент ускорения (Sar_step) | Коэффициент ускорения — Коэффициент ускорения для Parabolic SAR. |
| Максимальный шаг (Sar_maximum) | Максимальный шаг — Максимальный шаг для Parabolic SAR. |
| ma | Настройки iMA — Разделитель для настроек iMA. |
| Быстрая Ма (iMAperiod) | Быстрая Ма — Период быстрой скользящей средней. |
| Медленная Ма (iMAperiod2) | Медленная Ма — Период медленной скользящей средней. |
| md | Настройки MACD — Разделитель для настроек MACD. |
| Период быстрой средней (Fast_ema) | Период быстрой средней — Период быстрой экспоненциальной средней для MACD. |
| Период медленной средней (Slow_ema) | Период медленной средней — Период медленной экспоненциальной средней для MACD. |
| Период сигнальной линии (Signal_ema) | Период сигнальной линии — Период сигнальной линии MACD. |
Поиск по коду файла
#property version "2.0"
#property description "Коммерческая версия торгового робота SMART BOT SYSTEMS"
#property description "Внимание! робот использует систему усреднений"
#property description "- Вывод прибыли по экстримумам баров"
#property description "- Перекрытие, частичное закрытие ордеров"
#property description "- Ласт откусыватель ордеров"
#property strict
enum ENUM_YN {
No , // Нет
Yes // Да
};
enum ENUM_TF {
eM1 = PERIOD_M1, // 1 минута
eM5 = PERIOD_M5, // 5 минут
eM15 = PERIOD_M15, // 15 минут
eM30 = PERIOD_M30, // 30 минут
eH1 = PERIOD_H1, // 1 час
eH4 = PERIOD_H4, // 4 часа
eD1 = PERIOD_D1, // 1 день
};
input string v1 = "ПАРАМЕТРЫ ИНДИКАЦИИ";//.
input ENUM_YN Debug = Yes; // Принты журнала
input ENUM_YN InfoChart = Yes; // Грфические объекты
input int x_axis = 5; // Координата X панели
input int y_axis = 25; // Координата Y панели
int xDist1 = 300; // Расстояние по горизонтали блока нехватки средств
int FontChar = 9; // Размер шрифта под линиями
string v1_1 = "Индикатор iProfit";//.
int Percent=5;
int OffsetY=18;
int StepY=12;
int X1Row=15;
int X2Row=88;
int X3Row=138;
int X4Row=188;
int X5Row=255;
color ColorProfit = clrLime;
color ColorLoss = clrDarkOrange;
input string v1_=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";//.
input string v2 = "ДОПОЛНИТЕЛЬНЫЕ ПАРАМЕТРЫ";//.
input ENUM_YN TradeBuy = Yes; // Торговать Buy
input ENUM_YN TradeSell = Yes; // Торговать Sell
extern ENUM_YN UseNewBar = No; // Открытие колен на новом баре
extern ENUM_TF UNB_TF = eM5; // Открытие колен по заданному тайм-фрейму
input string Prefix = ""; // Префикс в названиях валютных пар.
string CommentOrd = "SBS"; // Комментарий к ордерам
int PauseTrade = 3; // Время ожидания между торговыми командами в сек
input int SpreadMax = 10; // Максимальное значение спреда
input int MagicNumber = 0; // Магик номер
input int FirstClose = 8; // Серия после которой закрывается первый ордер
sinput string v2__=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";//.
input string v3 = "УСТАНОВКИ РИСКА И MМ";//.
input double Risk = 1.0; // Risk если 0 то DefaultLot
input double Kf_MaxLot = 1000; // Во сколько раз макс.лот в серии больше стартового
input double MaxLot = 0.0; // Макс.лот если=0 -Kf_MaxLot
input double DefaultLot = 0.01; // Начальный лот,если Risk=0
input int MaxTrades = 10; // Макс кол-во ордеров в серии
input string v3_=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";//.
input string v4 = "УСТАНОВКИ ЛОТ ЭКСПОНЕНТЫ";//.
enum typeLotExp
{
FIX ,
DINAMIC ,
GEOMETRIY ,
ARIFMETIKA
};
input typeLotExp TypeLotExp = FIX; // Тип лот экспоненты
input double LotExponent = 1.4; // Коэффициент увеличения лота
input string v4_=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";//.
input string v5 = "УСТАНОВКИ ТРЕЙЛИНГА И БУ"; //.
enum typeTrail
{
TRALonPIPS, // Тралл по пунктам
TRALonBARS // Тралл по барам
};
input typeTrail TypeTrailing = TRALonPIPS;// Выбор трейлинга
input string v5_0=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";//.
input string v5_1 = "Стандартный Трейлинг Стоп";//.
input int TrailingStart = 5; // Уровень прибыли для включения трейлинга
input int TrailingStop = 4; // Уровень трейлинга (расстояние от текущей цены)
input int TrailStep = 1; // Шаг трейлинга
input string v5_2 = "Трейлинг Стоп по барам";//.
input ENUM_TF BarsTF = eM5; // Таймфрейм баров
input int BarsUse = 2; // Кол-во баров отступа для SL-БУ
input int BarsOtstup_ = 3; // Кол-во пунктов отступа от экстримума
input string v5_3 = "Безубыток";//.
input ENUM_YN BuSeries = No; // Использовать безубыток
input int BUstart = 8; // Профит в пунктах для установки БУ
input int BUsize = 2; // Уровень безубытка в пунктах
input string v5_=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";//.
sinput string v6 = "УСТАНОВКИ ЛАСТ ТРАЛА ОТКУСЫВАТЕЛЯ";//.
input int LevelPartClose = 0; // № ордера который кусаем - 0 откл
input int StartOrdLastTral = 0; // № колена,начала работы LastTral - 0 откл
input string v6_=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";//.
input string v7 = "УСТАНОВКИ ПЕРЕКРЫТИЯ ОРДЕРОВ";//.
input ENUM_YN TypeOverlap = No; // Перекрытие ордеров
input int MargTypeOverlap = 600; // Маржа для вкл перекрытия если оно отключено
input ENUM_YN PartOverlap = No; // Частичное перекрытие
input int MargPartOverlap = 600; // Маржа для вкл част-го перекрытия если оно отключено
int LeadingOrder = 4; // № колена вкл основного и частичного перекрытия
int ProfitPersent = 30; // Процент перекрытия(10...50)
double MultOver = 1.4; // Множитель % перекрытия когда подключается предпоследний ордер
int OverTralStart = 8; // Начало трала перекрытия ордеров
int OverTralSize = 5; // Шаг изменения трала
input string v7_=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";//.
input string v8 = "ПАРАМЕТРЫ ВХОДА - СОПРОВОЖДЕНИЯ";//.
input int PipStep = 20; // Шаг открытия колен
extern ENUM_YN Stop_order = No; // Сопровождение виртуальными стоп ордерами
input int TralStartPend = 5; // Начало трала отложенного ордера
input int TralSizePend = 3; // Шаг трала отложенного ордера
enum typesig
{
no_signal , // Через PipStep
yes_signal // По сигналу
};
input typesig TypeUsr = yes_signal; // Тип сигнала на усреднение
enum typetrade
{
no_type , // Без индикатора
yes_type // По сигналу
};
input typetrade Type_Trade = yes_type; // Тип сигнала на вход
input string st = "Параметры расширения шага";//.
extern int StartDynStep = 4; // Колено после которого расширяется шаг
extern int PipStepInc = 10; // Сколько добавлять к ПипСтепу
sinput string v8_=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";//.
input string v9 = "ПАРАМЕТРЫ РАСЧЕТА СИГНАЛЬЩИКОВ";//.
input ENUM_YN RSI_filtr = No; // Использовать RSI фильтр
input int LevelBuy = 30; // Уровень buy
input int LevelSell = 60; // Уровень sell
sinput string v9_=":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";//.
input ENUM_TF TFsig = eM5; // Таймфрейм сигнальщиков
input string p_s = "Parabolic SAR настройки";
input double Sar_step = 0.08; // Коэффициент ускорения
input double Sar_maximum = 0.1; // Максимальный шаг
input string ma = "iMA настройки";
input int iMAperiod = 12; // Быстрая Ма
input int iMAperiod2 = 40; // Медленная Ма
input string md = "MACD настройки";
input int Fast_ema = 12; // Период быстрой средней
input int Slow_ema = 34; // Период медленной средней
input int Signal_ema = 9; // Период сигнальной линии
int TicketB[], TicketS[], Typeoverlap, BarsOtstup, margpartoverlap,
margtypeoverlap, Delta2, Session,dig, Lpos[], totalsell,
slip, Cpos[], totalord, totalbuy, levels,
debug, infoChart, showProboy, showOtboy,
pipstep, leadingorder, overlap, overtralstart, sum,
FirstTicketBuy, FirstTicketSell, overtralsize, LastTicketBuy, LastTicketSell,
cu=1, ticketbuy, ticketsell, tralstartpend, tralsizepend,
PLastTicketBuy, PLastTicketSell, bs,cbs, trailingStart, trailingStop,
trailStep, imaperiod, fast_ema, slow_ema, signal_ema,
imaperiod2, PipStepBuy, PipStepSell, pipStepInc;
double pips,ZeroLine, Cprofit[], Lprofit[], Lprofit1, CurrentDrawdown,
CurrentMargLevel, SumProfit, SumLotBuy, SumLotSell, spreadmax,
Lot, Sum_lot, Sumlot, minLot, maxLot,
TV, DrawDownRate, FreeMargin, Balance, Sredstva,
Step, LastSLBuy, LastSLSell, spr, freez,stlev,
ProfitBuy, ProfitSell, LastLotBuy, LastLotSell, LastPriceBuy,
FirstPriceBuy, FirstPriceSell, maxlot, PrOver, BSPrice,SSPrice,
delta2, One_Lot, defaultlot, LastPriceSell, LastProfitSell,
FirstProfitBuy, FirstProfitSell, FirstLotBuy, FirstLotSell, LastProfitBuy,
PLastLotBuy, PLastLotSell, PLastProfitBuy, PLastProfitSell, Llot[],Clot[],
Cprofit1, Cprofit2, bUstart, bUsize, sar_step,sar_maximum;
color col, ColOver0, ColOver1;
string comment, Symb, Typetral="";
bool NoTrade, InitFail,
spreadON, flag, flag1, Partoverlap, result;
datetime NewBar_B, NewBar_S;
static double Zone_High, Zone_Low, ZeroZone, BuyZone, SellZone, delta;
static datetime CurrentBar;
string level;
color ProfitColor,ProfitColor2,ProfitColor3,LotColor,
LotColor1,OrdColor,OrdColor1,Coldelta;
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int res)
{
ObjectsDeleteAll();
EventKillTimer(); //кил таймера
}
void OnTimer() {
MainIndication();
ProfitLot();
}
void OnTick()
{
// код доступен только после оплаты
}
string fun2(string strA, string strB)
{
string res,vr1,vr2;
vr1=StringConcatenate(strA,strB);
vr2=StringConcatenate(strB,strA);
if(Prefix!="")
{
vr1=StringConcatenate(vr1,Prefix);
vr2=StringConcatenate(vr2,Prefix);
}
if(MarketInfo(vr1,MODE_BID)>0) res=vr1;
else if(MarketInfo(vr2,MODE_BID)>0) res=vr2;
return(res);
}
int EA_SIGNAL()
{
int signal = 0;
double close0 = iClose(Symb,0,0);
double close1 = iClose(Symb,0,1);
double Rsi0 = iRSI(Symb,0,14,PRICE_CLOSE,0);
double Rsi1 = iRSI(Symb,0,14,PRICE_CLOSE,1);
double isar_0 = iSAR(Symb, TFsig, sar_step, sar_maximum, 0);
double isar_1 = iSAR(Symb, TFsig, sar_step, sar_maximum, 1);
double imacd_M0 = iMACD(Symb, TFsig, fast_ema, slow_ema, signal_ema, PRICE_CLOSE, MODE_MAIN, 0);
double imacd_24 = iMACD(Symb, TFsig, fast_ema, slow_ema, signal_ema, PRICE_CLOSE, MODE_MAIN, 1);
double imacd_S0 = iMACD(Symb, TFsig, fast_ema, slow_ema, signal_ema, PRICE_CLOSE, MODE_SIGNAL, 0);
double imacd_S1 = iMACD(Symb, TFsig, fast_ema, slow_ema, signal_ema, PRICE_CLOSE, MODE_SIGNAL, 1);
double ima_0 = iMA(Symb, TFsig, imaperiod, 0, MODE_EMA, PRICE_CLOSE, 0);
double ima_1 = iMA(Symb, TFsig, imaperiod, 0, MODE_EMA, PRICE_CLOSE, 1);
double ima2_0 = iMA(Symb, TFsig, imaperiod2, 0, MODE_EMA, PRICE_CLOSE, 0);
double ima2_1 = iMA(Symb, TFsig, imaperiod2, 0, MODE_EMA, PRICE_CLOSE, 1);
if ((!RSI_filtr || (Rsi1 < LevelBuy))&&ima_1 > ima2_1 && ima_0 > isar_0 && ima_1 < isar_1 && imacd_M0 > imacd_S0 ) signal = 1;
if ((!RSI_filtr || (Rsi1 > LevelSell)) && ima_1 < ima2_1 && ima_0 < isar_0 && ima_1 > isar_1 && imacd_M0 < imacd_S0 ) signal = 2;
return(signal);
}
void TrailingStairs()
{
if(!TypeTrailing == TRALonPIPS) return;
double PriceBEBuy =PriceBE(OP_BUY);
double PriceBESell=PriceBE(OP_SELL);
int BuyOrders =OrdExist(OP_BUY);
int SellOrders =OrdExist(OP_SELL);
if (BuyOrders>0||SellOrders>0)
{
for(int i=0; i<=OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderMagicNumber()!=MagicNumber||OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY)
{
if((Bid-trailingStart*Point>PriceBEBuy)&&((OrderStopLoss()!=0&&Bid-trailingStop*Point>OrderStopLoss()+trailStep*Point)||OrderStopLoss()==0))
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-trailingStop*Point,Digits),OrderTakeProfit(),0,clrGreen))
{
if(debug)
Print("Ошибка стандартного трейлинг стопа!",OrderTicket(),". Ошибка: ",GetLastError());}
else
if(debug)
{Print("Модификация стандартный трейлинг стоп");}
}
}
if (OrderType()==OP_SELL)
{
if((Ask+trailingStart*Point<PriceBESell)&&((OrderStopLoss()!=0&&Ask+trailingStop*Point<OrderStopLoss()-trailStep*Point)||OrderStopLoss()==0))
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+trailingStop*Point,Digits),OrderTakeProfit(),0,clrGreen))
{
if(debug)
Print("Ошибка стандартного трейлинг стопа!",OrderTicket(),". Ошибка: ",GetLastError());}
else
if(debug)
{Print("Модификация стандартный трейлинг стоп");}
}
}
}
}
return;
}
void TrailingByShadows()
{
if(!TypeTrailing == TRALonBARS) return;
double PriceBUBuy = PriceBE(OP_BUY);
double PriceBUSell = PriceBE(OP_SELL);
double PriceBUBuy_ = PriceBUBuy + bUstart*Point;
double PriceBUSell_ = PriceBUSell - bUstart*Point;
double extremum_Buy = 0;
double extremum_Sell = 0;
for (int j=0; j<OrdersTotal(); j++)
{
if (!OrderSelect(j,SELECT_BY_POS,MODE_TRADES))continue; // break; смена
if(OrderMagicNumber() != MagicNumber || OrderSymbol()!=Symb)continue; // break; смена
if ((BarsUse < 1) || (BarsOtstup<=0))
{
if(debug)
Print("Ошибка трейлинга функции по барам, BarsUse не может быть меньше 1 ");
}
if (OrderType()==OP_BUY)
{
for(int i = 1; i <= BarsUse; i++)
{
if (i==1) extremum_Buy = iLow(Symb,BarsTF,i);
else
if (extremum_Buy > iLow(Symb,BarsTF,i)) extremum_Buy = iLow(Symb,BarsTF,i);
}
if (!BuSeries)
{
if (((NormalizeDouble(extremum_Buy - (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits)> OrderStopLoss()) || (OrderStopLoss()==0)) &&
(NormalizeDouble(extremum_Buy - (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits) > PriceBUBuy) &&
(NormalizeDouble(extremum_Buy - (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits) < NormalizeDouble(Bid - MarketInfo(Symb,MODE_STOPLEVEL)*Point,Digits)))
if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(extremum_Buy-(BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits),OrderTakeProfit(),OrderExpiration()))
{
if(debug)
Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());}
else
if(debug)
{Print(" Ордер модифицирован Trailing stop Bar");}
}
else
{
if (((NormalizeDouble(extremum_Buy - (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits)> OrderStopLoss()) || (OrderStopLoss()==0)) &&
(NormalizeDouble(extremum_Buy - (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits) > PriceBUBuy_) &&
(NormalizeDouble(extremum_Buy - (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits) < NormalizeDouble(Bid - MarketInfo(Symb,MODE_STOPLEVEL)*Point,Digits)))
if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(extremum_Buy-(BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits),OrderTakeProfit(),OrderExpiration()))
{
if(debug)
Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());}
else
if(debug)
{Print(" Ордер модифицирован Trailing stop Bar");}
}
}
if (OrderType()==OP_SELL)
{
for(int i = 1; i <= BarsUse; i++)
{
if (i==1) extremum_Sell = iHigh(Symb,BarsTF,i);
else
if (extremum_Sell < iHigh(Symb,BarsTF,i)) extremum_Sell = iHigh(Symb,BarsTF,i);
}
if (!BuSeries)
{
if (((NormalizeDouble(extremum_Sell + (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits)< OrderStopLoss()) || (OrderStopLoss()==0)) &&
(NormalizeDouble(extremum_Sell + (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits) < PriceBUSell) &&
(NormalizeDouble(extremum_Sell + (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits) > NormalizeDouble(Ask + MarketInfo(Symb,MODE_STOPLEVEL)*Point,Digits)))
if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(extremum_Sell +(BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits),OrderTakeProfit(),OrderExpiration()))
{
if(debug)
Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());}
else
if(debug)
{Print(" Ордер модифицирован Trailing stop Bar");}
}
else
{
if (((NormalizeDouble(extremum_Sell + (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits)< OrderStopLoss()) || (OrderStopLoss()==0)) &&
(NormalizeDouble(extremum_Sell + (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits) < PriceBUSell_) &&
(NormalizeDouble(extremum_Sell + (BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits) > NormalizeDouble(Ask + MarketInfo(Symb,MODE_STOPLEVEL)*Point,Digits)))
if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(extremum_Sell +(BarsOtstup + MarketInfo(Symb,MODE_SPREAD))*Point,Digits),OrderTakeProfit(),OrderExpiration()))
{
if(debug)
Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());}
else
if(debug)
{Print(" Ордер модифицирован Trailing stop Bar");}
}
}
}
}
void MoveToWL() {
if (bUstart < stlev) bUstart = stlev;
double PriceBUBuy = PriceBE(OP_BUY), PriceBUSell = PriceBE(OP_SELL);
bool omodif = false;
for (int i = 0; i <= OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS) == TRUE) {
if (bUstart > 0 && OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && (OrderStopLoss() == 0 || NormalizeDouble(OrderStopLoss()-PriceBUBuy,Digits) < NormalizeDouble(bUsize * Point,Digits))) {
if (NormalizeDouble(MarketInfo(Symbol(), MODE_BID) - (PriceBUBuy + (OrderCommission()/OrderLots() * Point)),Digits) > NormalizeDouble(bUstart * Point,Digits)) {
omodif= OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(PriceBUBuy + ((bUsize + OrderCommission()/OrderLots())* Point),Digits), OrderTakeProfit(), 0, clrRed);
if(debug){
Print("Ордер #",OrderTicket(),". модифицирован в Безубыток ");}
else
if(debug){
Print("Модификация ордера #",OrderTicket(),". Ошибка: ",GetLastError());}
}
}
}
if (OrderSelect(i, SELECT_BY_POS) == TRUE) {
if (bUstart > 0 && OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && (OrderStopLoss() == 0 || NormalizeDouble(PriceBUSell-OrderStopLoss(),Digits) < NormalizeDouble(bUsize * Point,Digits))) {
if (NormalizeDouble(PriceBUSell - (MarketInfo(Symbol(), MODE_ASK) + (OrderCommission()/OrderLots()* Point)),Digits) > NormalizeDouble(bUstart * Point,Digits)) {
omodif= OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(PriceBUSell - ((bUsize + OrderCommission()/OrderLots())* Point),Digits), OrderTakeProfit(), 0, clrGreen);
if(debug){
Print("Ордер #",OrderTicket(),". модифицирован в Безубыток ");}
else
if(debug){
Print("Модификация ордера #",OrderTicket(),". Ошибка: ",GetLastError());}
}
}
}
}
}
double PriceBE(int dir)
{
double BEPrice =0;
double MyBEPrice =0;
double BuyLots =0;
double SellLots =0;
double BuyProfit =0;
double SellProfit=0;
double BuyLevel =0;
double SellLevel =0;
double tp =0;
if(OrdExist(OP_BUY)>0||OrdExist(OP_SELL)>0)
{
for(int i=OrdersTotal(); i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber() != MagicNumber || OrderSymbol()!=Symb ) continue;
if(OrderType()==OP_BUY)
{
BuyLots=BuyLots+OrderLots();
BuyProfit=BuyProfit+OrderProfit()+OrderCommission()+OrderSwap();
}
if(OrderType()==OP_SELL)
{
SellLots=SellLots+OrderLots();
SellProfit=SellProfit+OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
double TickValue=MarketInfo(Symbol(),MODE_TICKVALUE);
if (BuyLots>0 ) BuyLevel=NormalizeDouble(Bid-(BuyProfit/(TickValue*BuyLots)*Point),Digits); else BuyLevel=0;
if (SellLots>0 ) SellLevel=NormalizeDouble(Ask+(SellProfit/(TickValue*SellLots)*Point),Digits); else SellLevel=0;
if ((BuyLots-SellLots)>0) BEPrice=NormalizeDouble(Bid-((BuyProfit+SellProfit)/(TickValue*(BuyLots-SellLots))*Point),Digits);
if ((SellLots-BuyLots)>0) BEPrice=NormalizeDouble(Ask+((BuyProfit+SellProfit)/(TickValue*(SellLots-BuyLots))*Point),Digits);
if(dir==OP_BUY) MyBEPrice=BuyLevel;
if(dir==OP_SELL) MyBEPrice=SellLevel;
if(dir==-1) MyBEPrice=BEPrice;
return(NormalizeDouble(MyBEPrice,Digits));
}
int OrdExist(int direction)
{
int OrdCount=0;
if (OrdersTotal()>0)
{
for(int i=0; i<=OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderMagicNumber() != MagicNumber || OrderSymbol()!=Symb) continue;
if (OrderType()==direction) OrdCount++;
}
}
return (OrdCount);
}
int CurrentCondition()
{
totalbuy=0; totalsell=0; //totalbs=0; totalss=0;totalbl=0; totalsl=0;
int n=OrdersTotal(),i,r,j;
ArrayResize(TicketB,n);
ArrayResize(TicketS,n);
for(r=0;r<n;r++)
{
if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symb)
{
if(OrderMagicNumber()==MagicNumber)
{
switch(OrderType())
{
case OP_BUY : TicketB[totalbuy] =OrderTicket(); totalbuy++; break;
case OP_SELL : TicketS[totalsell]=OrderTicket(); totalsell++; break;
}
}
}
}
else {Print("Сбой, при переборе ордеров, производится новый расчет"); return(0);}
}
ArrayResize(TicketS,totalsell);
ArrayResize(TicketB,totalbuy);
totalord=totalbuy+totalsell;
double pr1,pr2,pr3;
for(i=0;i<totalbuy-1;i++)
{
if(OrderSelect(TicketB[i],SELECT_BY_TICKET))
{
pr1=OrderOpenPrice(); pr3=pr1; r=i;
for(j=i+1;j<totalbuy;j++)
{
if(OrderSelect(TicketB[j],SELECT_BY_TICKET))
{
pr2=OrderOpenPrice();
if(pr2<pr3) {pr3=pr2;r=j;}
}
}
if(r!=i) {j=TicketB[i];TicketB[i]=TicketB[r];TicketB[r]=j;}
}
}
/*
for(i=0;i<totalbs-1;i++)
{
if(OrderSelect(TicketBS[i],SELECT_BY_TICKET))
{
pr1=OrderOpenPrice(); pr3=pr1; r=i;
for(j=i+1;j<totalbs;j++)
{
if(OrderSelect(TicketBS[j],SELECT_BY_TICKET))
{
pr2=OrderOpenPrice();
if(pr2<pr3) {pr3=pr2;r=j;}
}
}
if(r!=i) {j=TicketBS[i];TicketBS[i]=TicketBS[r];TicketBS[r]=j;}
}
}
for(i=0;i<totalbl-1;i++)
{
if(OrderSelect(TicketBL[i],SELECT_BY_TICKET))
{
pr1=OrderOpenPrice(); pr3=pr1; r=i;
for(j=i+1;j<totalbl;j++)
{
if(OrderSelect(TicketBL[j],SELECT_BY_TICKET))
{
pr2=OrderOpenPrice();
if(pr2<pr3) {pr3=pr2;r=j;}
}
}
if(r!=i) {j=TicketBL[i];TicketBL[i]=TicketBL[r];TicketBL[r]=j;}
}
}
*/
for(i=0;i<totalsell-1;i++)
{
if(OrderSelect(TicketS[i],SELECT_BY_TICKET))
{
pr1=OrderOpenPrice(); pr3=pr1; r=i;
for(j=i+1;j<totalsell;j++)
{
if(OrderSelect(TicketS[j],SELECT_BY_TICKET))
{
pr2=OrderOpenPrice();
if(pr2>pr3) {pr3=pr2;r=j;}
}
}
if(r!=i) {j=TicketS[i];TicketS[i]=TicketS[r];TicketS[r]=j;}
}
}
/*
for(i=0;i<totalss-1;i++)
{
if(OrderSelect(TicketSS[i],SELECT_BY_TICKET))
{
pr1=OrderOpenPrice(); pr3=pr1; r=i;
for(j=i+1;j<totalss;j++)
{
if(OrderSelect(TicketSS[j],SELECT_BY_TICKET))
{
pr2=OrderOpenPrice();
if(pr2>pr3) {pr3=pr2;r=j;}
}
}
if(r!=i) {j=TicketSS[i];TicketSS[i]=TicketSS[r];TicketSS[r]=j;}
}
}
for(i=0;i<totalsl-1;i++)
{
if(OrderSelect(TicketSL[i],SELECT_BY_TICKET))
{
pr1=OrderOpenPrice(); pr3=pr1; r=i;
for(j=i+1;j<totalsl;j++)
{
if(OrderSelect(TicketSL[j],SELECT_BY_TICKET))
{
pr2=OrderOpenPrice();
if(pr2>pr3) {pr3=pr2;r=j;}
}
}
if(r!=i) {j=TicketSL[i];TicketSL[i]=TicketSL[r];TicketSL[r]=j;}
}
}
*/
ProfitBuy=0;ProfitSell=0;LastPriceBuy=0;LastLotBuy=0;LastPriceSell=0;LastLotSell=0;FirstPriceSell=0;FirstTicketSell=0;
SumLotBuy=0;SumLotSell=0;Lprofit1=0;FirstPriceBuy=0;FirstTicketBuy=0;LastSLBuy=0;LastSLSell=0;LastTicketSell=0;LastTicketBuy=0;
FirstProfitBuy=0;FirstProfitSell=0;FirstLotBuy=0;FirstLotSell=0;LastProfitBuy=0;LastProfitSell=0;PLastLotBuy=0;PLastProfitBuy=0;
PLastTicketBuy=0;PLastLotSell=0;PLastProfitSell=0;PLastTicketSell=0;Cprofit1=0;Cprofit2=0;
bs=0;cbs=0; ArrayResize(Lprofit,totalord); ArrayResize(Llot,totalord); ArrayResize(Lpos,totalord);
ArrayResize(Cprofit,totalord); ArrayResize(Clot,totalord); ArrayResize(Cpos,totalord);
for(i=totalbuy-1;i>=0;i--)
{
if(OrderSelect(TicketB[i],SELECT_BY_TICKET))
{
LastLotBuy = OrderLots();
SumLotBuy += LastLotBuy;
LastProfitBuy = OrderProfit()+OrderSwap()+OrderCommission();
ProfitBuy += LastProfitBuy;
LastPriceBuy = OrderOpenPrice();
LastSLBuy = OrderStopLoss();
LastTicketBuy = OrderTicket();
if(i==totalbuy-1)
{
FirstLotBuy =LastLotBuy;
FirstPriceBuy =LastPriceBuy;
FirstTicketBuy=LastTicketBuy; //Тикет первого ордера Buy
FirstProfitBuy=LastProfitBuy;
}
else if(i==LevelPartClose)
{
PLastLotBuy =LastLotBuy;
PLastProfitBuy =LastProfitBuy;
PLastTicketBuy =LastTicketBuy;
}
if(Typeoverlap==1 && totalord>=leadingorder) //|| (Typeoverlap==2 && totalbuy >= leadingorder))
{
if(LastProfitBuy>0)
{
Lprofit[bs]=LastProfitBuy;
Llot[bs] = LastLotBuy;
Lpos[bs] = LastTicketBuy;
Lprofit1+=Lprofit[bs];
bs++;
}
else if(LastProfitBuy<0)
{
Cprofit[cbs]=LastProfitBuy;
Clot[cbs] = LastLotBuy;
Cpos[cbs] = LastTicketBuy;
Cprofit1+=Cprofit[cbs];
Cprofit2+=Cprofit[cbs]/Clot[cbs];
cbs++;
}
}
}
}
for(i=totalsell-1;i>=0;i--)
{
if(OrderSelect(TicketS[i],SELECT_BY_TICKET))
{
LastLotSell = OrderLots();
SumLotSell += LastLotSell;
LastProfitSell = OrderProfit()+OrderSwap()+OrderCommission();
ProfitSell += LastProfitSell;
LastPriceSell = OrderOpenPrice();
LastSLSell = OrderStopLoss();
LastTicketSell = OrderTicket();
if(i==totalsell-1)
{
FirstLotSell =LastLotSell;
FirstPriceSell =LastPriceSell;
FirstTicketSell=LastTicketSell; //Тикет первого ордера Sell
FirstProfitSell=LastProfitSell;
}
else if(i==LevelPartClose)
{
PLastLotSell =LastLotSell;
PLastProfitSell =LastProfitSell;
PLastTicketSell =LastTicketSell;
}
if(Typeoverlap==1 && totalord>=leadingorder) //|| (totalsell >= leadingorder && Typeoverlap ==2))
{
if(LastProfitSell>0)
{
Lprofit[bs]=LastProfitSell;
Llot[bs] = LastLotSell;
Lpos[bs] = LastTicketSell;
Lprofit1+=Lprofit[bs];
bs++;
}
else if(LastProfitSell<0)
{
Cprofit[cbs]=LastProfitSell;
Clot[cbs] = LastLotSell;
Cpos[cbs] = LastTicketSell;
Cprofit1+=Cprofit[cbs];
Cprofit2+=Cprofit[cbs]/Clot[cbs];
cbs++;
}
}
}
}
ArrayResize(Lprofit,bs);
ArrayResize(Llot,bs);
ArrayResize(Lpos,bs);
ArrayResize(Cprofit,cbs);
ArrayResize(Clot,cbs);
ArrayResize(Cpos,cbs);
if(Typeoverlap!=0)
{
for(i=0;i<bs-1;i++)
{
pr1=Lprofit[i]; pr3=pr1; r=i;
for(j=i+1;j<bs;j++)
{
pr2=Lprofit[j];
if(pr2>pr3) {pr3=pr2; r=j;}
}
if(r!=i)
{
j=Lpos[i];Lpos[i]=Lpos[r];Lpos[r]=j;
double k=Llot[i];Llot[i]=Llot[r];Llot[r]=k;
k=Lprofit[i];Lprofit[i]=Lprofit[r];Lprofit[r]=k;
}
}
for(i=0;i<cbs-1;i++)
{
pr1=Cprofit[i]; pr3=pr1; r=i;
for(j=i+1;j<cbs;j++)
{
pr2=Cprofit[j];
if(pr2<pr3) {pr3=pr2; r=j;}
}
if(r!=i)
{
j=Cpos[i];Cpos[i]=Cpos[r];Cpos[r]=j;
double k=Clot[i];Clot[i]=Clot[r];Clot[r]=k;
k=Cprofit[i];Cprofit[i]=Cprofit[r];Cprofit[r]=k;
}
}
}
SumProfit = NormalizeDouble(ProfitSell + ProfitBuy,2);
CurrentDrawdown = NormalizeDouble(MathMax((AccountBalance()+AccountCredit()-AccountEquity())/(AccountBalance()+AccountCredit())*100,0),2);
Sum_lot = NormalizeDouble(SumLotBuy - SumLotSell ,dig);// Суммарный лот (плюс или минус)
Sumlot = NormalizeDouble(MathAbs(Sum_lot ),dig); // Aбсолютное значение суммарного лота (значение по модулю, всегда плюс)
if(Sumlot==0) Sumlot=0.00000001; // Защита от нулевого значения
if(AccountMargin()>0) CurrentMargLevel=NormalizeDouble(AccountEquity()/AccountMargin()*100,0);
FreeMargin = NormalizeDouble(AccountFreeMargin(), 2);
Balance = NormalizeDouble(AccountBalance (), 2);
Sredstva = NormalizeDouble(AccountEquity () , 2);
pips=NormalizeDouble((AccountEquity()-AccountStopoutLevel()*AccountEquity()/100.0)/Sumlot/TV,0);
return(1);
}
double NewLot(int OrdType)
{
double newlot=0,cp;
switch(OrdType)
{
case OP_BUY :
cp=MathAbs((LastPriceBuy-Ask)/Point/pipstep);
switch(TypeLotExp)
{
case 1 : newlot = NormalizeDouble(LastLotBuy *LotExponent*cp ,dig); break; // Динамическая
case 2 : newlot = NormalizeDouble(LastLotBuy *MathPow(LotExponent, cp) ,dig); break; // Геометричесая
case 3 : newlot = NormalizeDouble(LastLotBuy +Lot *LotExponent ,dig); break; // Арифметическая
default: newlot = NormalizeDouble(LastLotBuy *LotExponent ,dig); break; // FixLotЕхр
}
break;
case OP_SELL :
cp=MathAbs((Bid-LastPriceSell)/Point/pipstep);
switch(TypeLotExp)
{
case 1 : newlot = NormalizeDouble(LastLotSell *LotExponent*cp ,dig); break; // Динамическая
case 2 : newlot = NormalizeDouble(LastLotSell *MathPow(LotExponent,cp) ,dig); break; // Геометричесая
case 3 : newlot = NormalizeDouble(LastLotSell +Lot *LotExponent ,dig); break; // Арифметическая
default: newlot = NormalizeDouble(LastLotSell *LotExponent ,dig); break; // FixLotЕхр
}
break;
}
if(maxlot==0) newlot=newlot; else
if(newlot > maxlot)Показано первые 50% кода (символов: 75021)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.