Navigation:Home > Content >

b-PSI@Trail_Base.mq4

Time: 2012-01-16 | Download file:b-PSI@Trail_Base.mq4

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|                                                              b-PSI@Trail_Base.mqh |
//|                                    Copyright © 2013-14, Igor Stepovoi aka TarasBY |
//|                                                                taras_bulba@tut.by |
//|   05.08.2011  Библиотека базовых функций трейлинга ордеров.                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|   Данный продукт предназначен для некоммерческого использования. Публикация раз-  |
//|решена только при указании имени автора (TarasBY). Редактирование исходного кода   |
//|допустима только при  условии сохранения данного текста,  ссылок и  имени автора.  |
//|Продажа библиотеки или отдельных её частей ЗАПРЕЩЕНА.                              |
//|   Автор не несёт ответственности за возможные убытки, полученные в результате ис- |
//|пользования библиотеки.                                                            |
//|   По всем вопросам, связанным с работой библиотеки, замечаниями или предложениями |
//|по её доработке обращаться на Skype: TarasBY или e-mail.                           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
#property copyright "Copyright © 2008-14, TarasBY WM R418875277808; Z670270286972"
#property link      "taras_bulba@tut.by"
//IIIIIIIIIIIIIIIIIII==================CONSTANS=================IIIIIIIIIIIIIIIIIIIIII+
//IIIIIIIIIIIIIIIIIII==========Внешние параметры модуля=========IIIIIIIIIIIIIIIIIIIIII+
extern int    BreakEven                = 30;       // Уровень, на котором срабатывает БезУбыток до размера в ProfitMIN
//IIIIIIIIIIIIIIIIIII=========Подключение внешних модулей=======IIIIIIIIIIIIIIIIIIIIII+
//IIIIIIIIIIIIIIIIIII========Глобальные переменные модуля=======IIIIIIIIIIIIIIIIIIIIII+
int           bi_cntTR = 0; 
bool          bb_TrailLOSS = false;                // разрешение на трал ЛОССа
/*IIIIIIIIIIIIIIIIIII===========Перечень функций модуля=========IIIIIIIIIIIIIIIIIIIIII+
void fInit_TrailBase (              - Инициализируем работу функции BU
//+-----------------------------------------------------------------------------------+
    bool& fb_TrailON                // флаг задействования трейлинга
)*/
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//bool fCheck_TrailBase()           - Проверяем переданные в функцию внешние параметры.
/*IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fModify_STOPs (                - Модифицируем СТОпы или осуществляем виртуальный трейлинг
//+-----------------------------------------------------------------------------------+
    int fi_Ticket,                  // Ticket
    bool fb_Trail                   // флаг разрешения модификации
)*/
/*IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fControl_TrailVSTOPs (         - Организовываем работу вирт. СТОПов, управляемых библиотекой трейлинга
//+-----------------------------------------------------------------------------------+
    int fi_Ticket,                  // Тикет ордера
    int fi_Slippage = 3             // проскальзывание
)*/
//|***********************************************************************************|
//| РАЗДЕЛ: ФУНКЦИИ ТРЕЙЛИНГА                                                         |
/*|***********************************************************************************|
bool fMove_ToBreakEven (            - Переводим ордер в БезУбыток (если задано)
//+-----------------------------------------------------------------------------------+
    string fs_Symbol,               // Symbol
    int fi_Ticket,                  // Ticket
    double& fd_NewSL                // возвращаемый новый SL
)*/
//|***********************************************************************************|
//| РАЗДЕЛ: ОБЩИХ ФУНКЦИЙ                                                             |
//|***********************************************************************************|
//void fSet_ValuesBase()            - Получаем рабочие переменные в соответствии с разрядностью
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//void fCheck_DecimalBase()         - Учитываем разрядность котировок
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Инициализируем работу функции BU                                           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fInit_TrailBase (bool& fb_TrailON)              // флаг задействования трейлинга
{
//----
    //---- Переменные функции fMove_ToBreakEven()
    fCheck_DecimalBase();
    if (BreakEven > 0 || bi_cntTR > 0)
    {
        //---- Библиотека задействована
        fb_TrailON = true;
        //---- Включаем флаг очистки GV-переменных
        bb_ClearGV = true;
        string lsa_Array[];
        int    li_cnt = -1;
        if (VirtualTrail_ON)
        {
            li_cnt++;
            ArrayResize (lsa_Array, li_cnt + 1);
            lsa_Array[li_cnt] = "_#VirtTP";
            li_cnt++;
            ArrayResize (lsa_Array, li_cnt + 1);
            lsa_Array[li_cnt] = "_#VirtSL";
        }
        if (BreakEven > 0)
        {
            li_cnt++;
            ArrayResize (lsa_Array, li_cnt + 1);
            lsa_Array[li_cnt] = "_#BU";
        }
        //---- Добавляем в рабочий массив префиксы временных GV-переменных
        fCreat_ArrayGV (bsa_prefGV, lsa_Array);
    }
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Проверяем переданные в функцию внешние параметры.                          |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fCheck_TrailBase()
{
//----
    if (BreakEven > 0) if (BreakEven <= ProfitMIN_Pips)
    {bs_ERROR = "Поставьте BreakEven > ProfitMIN_Pips или BreakEven = 0 !!!"; return (false);}
//----
    return (true);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Модифицируем СТОпы или осуществляем виртуальный трейлинг                   |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fModify_STOPs (
    int fi_Ticket,                  // Ticket
    bool fb_Trail)                  // флаг разрешения модификации
//+...................................................................................+
{
    //---- Проверяем срабатывание БУ
    bool lb_BreakEven = fMove_ToBreakEven (bs_Symbol, fi_Ticket, bd_NewSL);
//----
    if (!fb_Trail) if (!lb_BreakEven) return (false);
//----
    //int  err = GetLastError();
    bool lb_modifyTP = false;
//----
    if (bd_NewTP != 0.) if (NDD (bd_NewTP - bd_curTP) != 0. || bd_curTP == 0.) lb_modifyTP = true;
    //---- Начинаем с проверки нового СТОПа минимальному заработку по ордеру (если не тралили LOSS)
    if (!fCheck_MinProfit (bd_ProfitMIN, bd_NewSL, !bb_TrailLOSS)) if (!lb_modifyTP) return (false);
    int li_result = -2;
    if (bi_Type == OP_SELL) {bd_Price -= bd_Spread;}
    //---- Если новый SL пересёк текущую цену
    if (bi_cmd * (bd_NewSL - bd_Price) > 0.) {bd_NewSL = bd_Price;}
    //---- SL тянем в сторону уменьшения убытка
    if (bd_curSL != 0.) if (bi_cmd * (bd_NewSL - bd_curSL) <= bd_TrailStep) if (!lb_modifyTP)
    //---- Перевод SL в БезУбыток
    {if (!lb_BreakEven) return (false);}
    //---- Вычисляем расстояние от SL до текущей цены
    bd_Trail = MathAbs (bd_Price - bd_NewSL);
    //---- Модифицируем стоплосс и тэйкпрофит
    if (!VirtualTrail_ON)
    {
        li_result = fOrderModify (fi_Ticket, bd_OpenPrice, bd_NewSL, bd_NewTP);
        if (li_result >= 0) fSet_Comment (bdt_curTime, fi_Ticket, 20, "", li_result != 0, (lb_BreakEven || bd_curTP == 0.));
        //---- Помечаем факт срабатыванию БУ
        if (lb_BreakEven) {if (li_result == 1) GlobalVariableSet (StringConcatenate (fi_Ticket, "_#BU"), bd_NewSL);}
        return (li_result == 1);
    }
    //---- Меняем виртуальный Стоп
    else
    {
        //---- Модифицируем TP
        if (lb_modifyTP)
        {
            //---- Увеличиваем TP
            GlobalVariableSet (StringConcatenate (fi_Ticket, "_#VirtTP"), bd_NewTP);
            if (OrderTakeProfit() != 0.) if (bi_cmd * NDD (bd_NewTP - bd_curTP) > 0.)
            {
                li_result = fOrderModify (fi_Ticket, bd_OpenPrice, OrderStopLoss(), bd_NewTP);
                if (li_result >= 0) fSet_Comment (bdt_curTime, fi_Ticket, 20, "", li_result != 0);
                //---- Если не нужно изменять SL
                if (bd_NewSL == bd_curSL) return (li_result == 1);
            }
        }
        //---- Двигаем виртуальный SL
        GlobalVariableSet (StringConcatenate (fi_Ticket, "_#VirtSL"), bd_NewSL);
        //---- Помечаем факт срабатыванию БУ
        if (lb_BreakEven) {GlobalVariableSet (StringConcatenate (fi_Ticket, "_#BU"), bd_NewSL);}
        if (bb_VirtualTrade) return (false);
        fSet_Comment (bdt_curTime, fi_Ticket, 20, "[Virt]", True, lb_BreakEven);
        //---- Рисуем на чарте виртуальные СТОПы
        if (bb_CreatVStopsInChart)
        {
            if (!fDraw_VirtSTOP (fi_Ticket, bs_NameGV, bi_cmd, 0, bd_NewSL))
            {fWrite_Log (StringConcatenate ("Error for draw VirtSL for #", fi_Ticket, " !!!"), bi_indERR);}
            if (lb_modifyTP) if (!fDraw_VirtSTOP (fi_Ticket, bs_NameGV, bi_cmd, 1, bd_NewTP))
            {fWrite_Log (StringConcatenate ("Error for draw VirtTP for #", fi_Ticket, " !!!"), bi_indERR);}
        }
    }
    //---- Контролируем возможные ошибки
	   fGet_LastErrorInArray ("fModify_STOPs()", bi_indERR);
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Организовываем работу вирт. СТОПов, управляемых библиотекой трейлинга      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fControl_TrailVSTOPs (
    int fi_Ticket,                  // Тикет ордера
    int fi_Slippage = 3)            // проскальзывание
//+...................................................................................+
{
    bool lb_SL = false, lb_TP = false;
//----
    if (bd_NewSL > 0) {lb_SL = (bi_cmd * (bd_NewSL - bd_Price) >= 0.);}
    if (bd_NewTP > 0) {lb_TP = (bi_cmd * (bd_Price - bd_NewTP) >= 0.);}
    //---- Если сработал виртуальный СТОП, закрываем ордер
    if (!lb_SL) if (!lb_TP) return (false);
    RefreshRates();
    bd_Price = fGet_TradePrice (bi_Type, bb_RealTrade, bs_Symbol);
    bool lb_close = fOrderClose (fi_Ticket, bd_Lots, bd_Price, fi_Slippage);
    fSet_Comment (bdt_curTime, fi_Ticket, 21, "Trail[V_STOP`s]()", lb_close, lb_SL, bd_NewSL, bd_NewTP);
//----
    return (lb_close);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| РАЗДЕЛ: ФУНКЦИИ ТРЕЙЛИНГА                                                         |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//         Переводим ордер в БезУбыток (если задано)                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fMove_ToBreakEven (
    string fs_Symbol,               // Symbol
    int fi_Ticket,                  // Ticket
    double& fd_NewSL)               // возвращаемый новый SL
//+...................................................................................+
{
    string ls_Name = StringConcatenate (fi_Ticket, "_#BU");
//----
    if (GlobalVariableCheck (ls_Name)) return (false);
    //---- Прописываем работу БУ
    if (BreakEven > 0)
    {
        if (bi_cmd * (bd_Price - bd_OpenPrice) <= bd_BreakEven) return (false);
        //---- Если SL в зоне "лосса" или его нет
        if (bi_cmd * (bd_OpenPrice - bd_curSL) > 0. || bd_curSL == 0.)
        {
            //---- Формируем размер БУ
            fd_NewSL = bd_OpenPrice + bi_cmd * bd_ProfitMIN;
            bs_fName = "fMove_ToBreakEven()";
            fSet_Comment (fi_Ticket, fi_Ticket, 23, bs_fName, True, fd_NewSL);
            return (true);
        }
        //---- Если БУ уже выставлен (другой функцией)
        else GlobalVariableSet (ls_Name, bd_curSL);
    }
    //---- Контролируем возможные ошибки
	   fGet_LastErrorInArray (bs_fName, bi_indERR);
//----
    return (false);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//+===================================================================================+
//|***********************************************************************************|
//| РАЗДЕЛ: ОБЩИХ ФУНКЦИЙ                                                             |
//|***********************************************************************************|
//+===================================================================================+
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Получаем рабочие переменные в соответствии с разрядностью                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fSet_ValuesBase()
{
//----
    bd_ProfitMIN = NDP (ProfitMIN_Pips);
    bd_BreakEven = NDP (BreakEven);
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Учитываем разрядность котировок                                            |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fCheck_DecimalBase()
{
//----
    BreakEven *= bi_Decimal;
//----
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

Recommend