Logo

Вход

Войти с помощью соц. сетей
Пока нет объявлений.
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
  • #1 Свернуть

    Нужна помощь с кодом

    Помогите написать функцию которая возвращает бар последнего пересечения MA при условии что между последним и предпоследним пересечением есть допустим 10 баров и от точки последнего пересечения до минимума есть заданное количество пунктов . уже третьи сутки бьюсь ничего не получается
    MQL код:

    //+------------------------------------------------------------------+
    //| test.mq4 |
    //| Copyright 2017, MetaQuotes Software Corp. |
    //| [url]https://www.mql5.com[/url] |
    //+------------------------------------------------------------------+

    #property copyright "Copyright 2017, MetaQuotes Software Corp."
    #property link "https://www.mql5.com"
    #property version "1.00"
    #property strict



    enum ENUM_YESNO
    {
    YES,
    NO
    };




    extern int FMa=4; // Fast MA
    extern int SMa=52; // Slow MA
    extern int MinTHP=120;
    extern int MaxTHP=700;
    extern int CountBar=20; // количество баров между MA
    input ENUM_YESNO FiltrSignalBigTF = NO;
    input ENUM_TIMEFRAMES TF=PERIOD_CURRENT;
    input ENUM_TIMEFRAMES TFBig=PERIOD_H1;
    extern double CloseProfit = 30 ;
    extern int MaxOpenOrders=100;// Максимальное колличество ордеров 0 -неограничено




    extern string trade2_="Настройки торговли Общие";
    extern int Magic=777; // Магический номер
    extern int Slippage=0; // Проскальзывание
    extern bool MarketWatch=false; // Режим торговли по MarketWatch true = сначала выставляются позиции/ордера без стопов, потом происходит модификация - для некоторых брокеров
    extern bool ClosePosifChange=false; // Закрывать позиции при обратном сигнале
    extern bool CloseEndDay=false; // Закрывать все ордера в конце дня с понедельника по четверг включительно с 23:50 в пятницу с 22:50

    extern string autolot_="Настройки автолота";
    extern double Lots=0.1; // Фиксирвоанный лот
    extern bool DynamicLot=true ; // Динамический лот
    extern double LotBalPcnt=0.5; // % от депозита
    extern double MinLot = 0.1; // Минимальный лот при расчете
    extern double MaxLot = 100; // Максимальный лот при расчете
    extern double Martin=1; // Если 1 то не используется, Коэффициент мартина на следующую сделку после убытончой

    extern string autolot_1="Настройки увеличения процента после серии убыточных ордеров";
    extern ENUM_YESNO PrcUv=NO;
    extern double FactorPercent=2; // коефициент умножения стартового процента
    extern int NumberCloseOrder=20; // количество ордеров в закрытой серии минимум


    extern string timetrade_="Настройки времени торговли";
    extern int OpenHour=0; // Час открытия торгов
    extern int OpenMinute=0; // Минута открытия торгов
    extern int CloseHour=23; // Час закрытия торгов
    extern int CloseMinute=59; // Минута закрытия торгов


    int timeCheckSignal; // Время открытия позиции
    double sll,tpp; // Для вычисления стопов

    int NumberBar;
    int NumberBarVhera;
    string Signal="No Signal";
    double PriceBuy=0.0; // цена пересечения МА для сигнала на Buy
    double PriceSell=0.0; // цена пересечения МА для сигнала на Sell
    double MaxHigh=0.0; // цена бара с максимальным значением между пересечениями двух МА
    double MinLow=0.0; // цена бара с минимальным значением между пересечениями двух МА
    int MaxHighBar; // номер бара с максимальным значением между пересечениями двух МА
    int MinLowBar; // номер бара с минимальным значением между пересечениями двух МА
    datetime timevhera;
    int HighIndexMP3Sell; // индекс бара максимума прошлого дня
    int LowIndexMP3Buy; // индекс бара минимума прошлого дня
    double HighMP3Sell; // цена максимума вчерашнего дня для MP3 на SELL
    double LowMP3Buy; // цена минимума вчерашнего дня для MP3 на Buy
    int CountBarVheraSeg; // количество баров за сегодня и вчера для расчета максимума учитывается в диапазоне для расчета
    double MaxPriceSegodny=0.0; // максимальное значение цены за сегодня
    double MinPriceSegodny=0.0; // минимальное значение цены за сегодня
    datetime TimeBar; //Дата бара первого пересечения
    double Profit=0.0; //Профит по открытым позициям
    int CountBarBigTF = 0; // Номер бара последнего пересечения на старшем таймфрейме
    bool NoBanTradeToday = true ; // запрет торговли сегодня
    double mas=0.0;
    double maf=0.0;
    double mas_p=0.0;
    double maf_p=0.0;
    int MinBarOtRU3;
    int MaxBarOtRU3;
    double MinPriceRU3=0.0; // Минимальная цена от нулевого бара до минимума между MA
    double MaxPriceRU3=0.0; // Максимальная цена от нулевого бара до максимума между MA
    //========= Переменные для индикатора ===========//

    double val1;
    double val2;
    double up = 0.0;
    double down =0.0;
    double upnazad=0.0;
    double downnazad=0.0;
    //=============================================//
    bool OpenBuy=false;
    bool OpenSell=false;
    bool OpenBuyPerezaxod=false;
    bool OpenSellPerezaxod=false;
    double gd_84 = 0.0;
    double gd_92 = 0.0;
    double LotBalancePcnt=0.0;

    // Временные переменные


    bool NewSignalBuy=false;
    bool NewSignalSell=false;
    double PriceNewSignalBuy=0.0;
    double PriceNewSignalSell=0.0;

    datetime TimePros; // время максимальной просадки

    //+------------------------------------------------------------------+
    //| Expert initialization function |
    //+------------------------------------------------------------------+
    int OnInit()
    {
    //---

    //---
    return(INIT_SUCCEEDED);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
    {
    //---

    }
    //+------------------------------------------------------------------+
    //| Expert tick function |
    //+------------------------------------------------------------------+
    void OnTick()
    {
    //---
    if (gd_84 > AccountProfit()){ gd_84 = AccountProfit(); TimePros=TimeCurrent();}
    if (gd_92 < AccountProfit()) gd_92 = AccountProfit();
    //---

    //Найдем день недели
    int DayWeek=TimeDayOfWeek(TimeCurrent());

    //Сегодняшний день
    datetime timsegodny=TimeCurrent();
    MqlDateTime time;
    time.year=TimeYear(TimeCurrent()); // год
    time.mon=TimeMonth(TimeCurrent()); // месяц
    time.day=TimeDay(TimeCurrent()); // день
    time.hour=0; // час
    time.min=0; // минуты
    timsegodny=StructToTime(time);

    // Количество баров от начала дня сегодня //
    NumberBar=iBarShift(Symbol(),TF,timsegodny);

    //--------------------------------------//

    CountBarBigTF = NumberLastBarMaTF(FMa,SMa,TFBig,1,100000); // номе бара последнего пересечения на старшем таймфрейме

    // сегодняшний день 2
    datetime timeseg=TimeCurrent();

    MqlDateTime seg;
    TimeToStruct(timeseg,seg);
    seg.hour=0; // час
    seg.min=0; // минуты
    timeseg=StructToTime(seg);

    // Вчерашний день
    if(DayWeek==1){timevhera=TimeCurrent()-72*60*60;}
    if(DayWeek==2 || DayWeek==3 ||DayWeek==4 ||DayWeek==5) {timevhera=TimeCurrent()-24*60*60;}
    MqlDateTime vhera;
    TimeToStruct(timevhera,vhera);
    vhera.hour=0; // час
    vhera.min=0; // минуты
    timevhera=StructToTime(vhera);

    // Количество баров от начала вчерашнего дня //
    NumberBarVhera=iBarShift(Symbol(),TF,timevhera);
    CountBarVheraSeg=NumberBarVhera-NumberBar;

    // Найдем максимум и минимум прошлого дня

    HighIndexMP3Sell=iHighest(Symbol(),TF,MODE_HIGH,Co untBarVheraSeg,NumberBar); // получаем индекс бара максимума прошлого дня
    LowIndexMP3Buy=iLowest(Symbol(),TF,MODE_LOW,CountB arVheraSeg,NumberBar); // получаем индекс бара минимума прошлого дня







    // если есть сегодня одно пересечение растояние между первым и предыдущим пересечением
    // и расстояние между двумя пересечениями достаточное то вычисляем цену пересечения
    if (BarMa(FMa,SMa,1,NumberBar)>0 && BarMa(FMa,SMa,2,NumberBar+1000)-BarMa(FMa,SMa,1,NumberBar)>CountBar /*&& TimeBar*/ ){
    // проверим пересечение Ma
    mas=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,1); // Slow MA shifted on 1 Period
    maf=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,1); // Fast MA shifted on 1 Period
    mas_p=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,2); // Slow MA shifted on 2 Period
    maf_p=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,2); // Fast MA shifted on 2 Period

    }


    //+++++++++++++++++++++++ Конец OnTick() ++++++++++++++++++++++++
    Comment (
    //"Signal === ",Signal+" \n"+
    // " Количество закрытых ордеров подряд == ",CountInHistoryCloseOrder(Symbol(),-1,Magic)+" \n"+
    // "Дата закрытия последнего ордера == ",GetDateCloseLastPos(Symbol(),-1,Magic)+" \n"+
    //"Profit == ",Profit+" $\n"+
    "Максимальный Профит =",DoubleToStr(gd_92,2)+" $\n"+
    "Минимальная Просадка + ="+DoubleToStr(gd_84,2)+" ___ "+ TimePros+" \n"+
    " Количество пересечений сегодня = "+CountPeresehMa(FMa,SMa,NumberBar)+" \n"+
    // "Номер бара Sell = "+ FirstBarRu3(Symbol(),CountPeresehMa(FMa,SMa,Number Bar),"Sell")+" \n"+
    "Номер бара Buy = "+ FirstBar(Symbol(),CountPeresehMa(FMa,SMa,NumberBar ),"Buy")


    );

    }

    //+------------------------------------------------------------------+
    //| Возвращает номер бара последнего пересечения MA |
    //+--------------------------------------------------------------------+
    //+----------------------------------------------------------------------------+
    //| Параметры:
    //| sy - наименование инструмента ("" - любой символ,
    //| countperes - общее количество пересечений для поиска
    //| signal - сигнал который ищем значение может быть Buy или Sell
    //+----------------------------------------------------------------------------+


    int FirstBar(string sy="",int countperes=0, string signal="")
    {
    int startbarBuy, endbarBuy,startbarSell, endbarSell ;
    int bar;

    if (sy=="0") sy=Symbol();
    if (_Symbol==sy || sy=="")
    {
    if( signal=="Buy")
    {
    // Проверяем если есть сегодня пересечение
    if(BarMa(FMa,SMa,1,NumberBar)>0 ) // возвращает бар последнего пересечения

    {
    for ( int i=1; i<countperes ; i++)
    {


    //если есть пересечение Ma сегодня и Если расстояние между последними пересечениями больше CountBar и высота больше или равна MinTHP и меньше или равно MaxTHP
    if (BarMa(FMa,SMa,countperes,NumberBar)>0 && (BarMa(FMa,SMa,i+1,NumberBar+1000)-BarMa(FMa,SMa,i,NumberBar))>CountBar)
    {


    startbarBuy =BarMa(FMa,SMa,i,NumberBar);// номер бара первого пересечения
    endbarBuy= BarMa(FMa,SMa,i+1,NumberBar+1000); // номер бара второго пересечения

    // проверим пересечение Ma
    mas=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,startbar Buy); // Slow MA shifted on 1 Period
    maf=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,startbar Buy); // Fast MA shifted on 1 Period
    mas_p=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,startb arBuy+1); // Slow MA shifted on 2 Period
    maf_p=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,startb arBuy+1); // Fast MA shifted on 2 Period

    // получим цену пересечения Ma и расщитаем есть ли Значения больше ТНР и Меньше MaxTHP
    if((maf>=mas && maf_p<=mas_p))
    {
    PriceBuy=NormalizeDouble(mas,5); // цена пересечения МА для сигнала на Buy

    // Найдем Минимум среди баров пересечения двух точек
    MinLowBar= iLowest(Symbol(),TF,MODE_LOW, endbarBuy,startbarBuy); // номер бара с минимальным значением между пересечениями двух МА
    MinLow=NormalizeDouble(iLow(Symbol(),TF,MinLowBar) ,5);// цена бара с минимальным значением между пересечениями двух МА
    // Расщитаем растояние от точки начала разворота до конца разворота
    if((PriceBuy-MinLow)/Point>= MinTHP && (PriceBuy-MinLow)/Point<=MaxTHP)
    {
    bar=startbarBuy;
    break;
    }
    }

    }
    }
    }
    }

    if( signal=="Sell")
    {
    // Проверяем если есть сегодня пересечение
    if(BarMa(FMa,SMa,1,NumberBar)>0 ) // возвращает бар последнего пересечения
    {
    for ( int i=1; i<countperes ; i++)
    {


    //если есть пересечение Ma сегодня и Если расстояние между последними пересечениями больше CountBar и высота больше или равна MinTHP и меньше или равно MaxTHP
    if (BarMa(FMa,SMa,countperes,NumberBar)>0 && (BarMa(FMa,SMa,i+1,NumberBar+1000)-BarMa(FMa,SMa,i,NumberBar))>CountBar)
    {

    startbarSell=BarMa(FMa,SMa,i,NumberBar); // номер бара первого пересечения
    endbarSell=BarMa(FMa,SMa,i+1,NumberBar+1000); // номер бара второго пересечения

    // проверим пересечение Ma
    mas=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,startbar Sell); // Slow MA shifted on 1 Period
    maf=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,startbar Sell); // Fast MA shifted on 1 Period
    mas_p=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,startb arSell+1); // Slow MA shifted on 2 Period
    maf_p=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,startb arSell+1); // Fast MA shifted on 2 Period

    // получим цену пересечения Ma и расщитаем есть ли Значения больше ТНР и Меньше MaxTHP
    if((maf<=mas && maf_p>=mas_p))
    {
    PriceSell=NormalizeDouble(mas_p,5); // цена пересечения МА для сигнала на Sell

    // Найдем Максимум среди баров пересечения двух точек
    MaxHighBar= iHighest(Symbol(),TF,MODE_HIGH, endbarSell,startbarSell); // номер бара с максимальным значением между пересечениями двух МА
    MaxHigh= NormalizeDouble(iHigh(Symbol(),TF,MaxHighBar),5); // цена бара с максимальным значением между пересечениями двух МА
    // Расщитаем растояние от точки начала разворота до конца разворота
    if((MaxHigh-PriceSell)/Point>=MinTHP && (MaxHigh-PriceSell)/Point<= MaxTHP)
    {
    bar=startbarSell;
    break;
    }
    }

    }
    }
    }
    }

    if (BarMa(FMa,SMa,1,NumberBar)<0) bar = -1;
    }
    return(bar);
    }





    //+------------------------------------------------------------------+
    //| Возвращает количество пересечений за N-баров |
    //+--------------------------------------------------------------------+
    //+----------------------------------------------------------------------------+
    //| Параметры:
    //| F_Ma - Быстрая MA
    //| S_Ma - Медленная MA
    //| countper - Какое по счету пересечение MA искать
    //| barovSearh - Количество баров для поиска
    //+----------------------------------------------------------------------------+

    int CountPeresehMa(int F_Ma=0, int S_Ma=0 , int barovSearh=0)
    {
    int bar, count;
    double mas2, maf2,
    mas_p2, maf_p2;
    bool flag=false;


    for(count=0, bar=0; bar<=barovSearh; bar++) // Начинаем с послнего бара
    {
    mas2=iMA(Symbol(),0,S_Ma,0,MODE_SMA,PRICE_CLOSE,ba r); // Slow MA shifted on 1 Period
    maf2=iMA(Symbol(),0,F_Ma,0,MODE_SMA,PRICE_CLOSE,ba r); // Fast MA shifted on 1 Period
    mas_p2=iMA(Symbol(),0,S_Ma,0,MODE_SMA,PRICE_CLOSE, bar+1); // Slow MA shifted on 2 Period
    maf_p2=iMA(Symbol(),0,F_Ma,0,MODE_SMA,PRICE_CLOSE, bar+1); // Fast MA shifted on 2 Period

    if((maf2>=mas2 && maf_p2<=mas_p2) ||
    (maf2<=mas2 && maf_p2>=mas_p2))
    {

    count++;


    }
    }
    return(count);
    }

    //+------------------------------------------------------------------+
    //| Поиск пересечений MA указанное количество |
    //+------------------------------------------------------------------+
    //+----------------------------------------------------------------------------+
    //| Параметры:
    //| F_Ma - Быстрая MA
    //| S_Ma - Медленная MA
    //| countper - Какое по счету пересечение MA искать
    //| barovSearh - Количество баров для поиска
    //+----------------------------------------------------------------------------+

    int BarMa(int F_Ma=0, int S_Ma=0, int countper=0 , int barovSearh=0)
    {
    int bar, count;
    double mas2, maf2,
    mas_p2, maf_p2;
    bool flag=false;

    for(count=0, bar=1; bar<barovSearh+1; bar++) // Начинаем с послнего бара
    {
    mas2=iMA(Symbol(),0,S_Ma,0,MODE_SMA,PRICE_CLOSE,ba r); // Slow MA shifted on 1 Period
    maf2=iMA(Symbol(),0,F_Ma,0,MODE_SMA,PRICE_CLOSE,ba r); // Fast MA shifted on 1 Period
    mas_p2=iMA(Symbol(),0,S_Ma,0,MODE_SMA,PRICE_CLOSE, bar+1); // Slow MA shifted on 2 Period
    maf_p2=iMA(Symbol(),0,F_Ma,0,MODE_SMA,PRICE_CLOSE, bar+1); // Fast MA shifted on 2 Period

    if((maf2>=mas2 && maf_p2<=mas_p2) ||
    (maf2<=mas2 && maf_p2>=mas_p2))
    {
    flag=true;
    count++;


    if(count == countper) break; // 5 линий есть - выход
    }

    }
    if (flag==false) bar= -1;
    return(bar);
    }

    //+------------------------------------------------------------------+
    //+--------------------------------------------------------------------+
    //| Возвращает бар на котором было последнее пересечений MA |
    //+--------------------------------------------------------------------+
    //+----------------------------------------------------------------------------+
    //| Параметры:
    //| F_Ma - Быстрая MA
    //| S_Ma - Медленная MA
    //| countper - Какое по счету пересечение MA искать
    //| barovSearh - Количество баров для поиска
    //| bigtf - таймфрейм
    //+----------------------------------------------------------------------------+

    int NumberLastBarMaTF(int F_Ma=0, int S_Ma=0,datetime tf=PERIOD_CURRENT, int countper=0 , int barovSearh=0)
    {
    int bar, count;
    double mas1, maf1,
    mas_p1, maf_p1;
    int NumBar=0;
    bool flag=false;


    for(count=0, bar=0; bar<barovSearh; bar++) // Начинаем с послнего бара
    {
    mas1=iMA(Symbol(),tf,S_Ma,0,MODE_SMA,PRICE_CLOSE,b ar); // Slow MA shifted on 1 Period
    maf1=iMA(Symbol(),tf,F_Ma,0,MODE_SMA,PRICE_CLOSE,b ar); // Fast MA shifted on 1 Period
    mas_p1=iMA(Symbol(),tf,S_Ma,0,MODE_SMA,PRICE_CLOSE ,bar+1); // Slow MA shifted on 2 Period
    maf_p1=iMA(Symbol(),tf,F_Ma,0,MODE_SMA,PRICE_CLOSE ,bar+1); // Fast MA shifted on 2 Period

    if(maf1>=mas1 && maf_p1<=mas_p1) {
    NumBar = bar; //BUY
    count++;
    if(count == countper) break; // 5 линий есть - выход
    }

    if (maf1<=mas1 && maf_p1>=mas_p1){
    NumBar = bar; //SELL
    count++;
    if(count == countper) break; // 5 линий есть - выход
    }

    }

    return(NumBar);
    }

    //+--------------------------------------------------------------------+
    //| Поиск пересечений MA указанное количество возвращает бай или селл |
    //+--------------------------------------------------------------------+
    //+----------------------------------------------------------------------------+
    //| Параметры:
    //| F_Ma - Быстрая MA
    //| S_Ma - Медленная MA
    //| countper - Какое по счету пересечение MA искать
    //| barovSearh - Количество баров для поиска
    //| bigtf - таймфрейм
    //+----------------------------------------------------------------------------+

    string BarMaBigTF(int F_Ma=0, int S_Ma=0,datetime bigtf=PERIOD_CURRENT, int countper=0 , int barovSearh=0)
    {
    int bar, count;
    double mas1, maf1,
    mas_p1, maf_p1;
    string sig="На этом участке нет пересечений";
    bool flag=false;
    // ObjectsDeleteAll(); // Удалить вертикальные линии

    for(count=0, bar=0; bar<barovSearh; bar++) // Начинаем с послнего бара
    {
    mas1=iMA(Symbol(),bigtf,S_Ma,0,MODE_SMA,PRICE_CLOS E,bar); // Slow MA shifted on 1 Period
    maf1=iMA(Symbol(),bigtf,F_Ma,0,MODE_SMA,PRICE_CLOS E,bar); // Fast MA shifted on 1 Period
    mas_p1=iMA(Symbol(),bigtf,S_Ma,0,MODE_SMA,PRICE_CL OSE,bar+1); // Slow MA shifted on 2 Period
    maf_p1=iMA(Symbol(),bigtf,F_Ma,0,MODE_SMA,PRICE_CL OSE,bar+1); // Fast MA shifted on 2 Period

    if(maf1>=mas1 && maf_p1<=mas_p1) {
    sig ="Buy"; //BUY
    count++;
    if(count == countper) break; // 5 линий есть - выход
    }

    if (maf1<=mas1 && maf_p1>=mas_p1){
    sig ="Sell"; //SELL
    count++;
    if(count == countper) break; // 5 линий есть - выход
    }

    }

    return(sig);
    }
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Сообщение от missha32 Посмотреть сообщение
    Помогите написать функцию которая возвращает бар последнего пересечения MA при условии что между последним и предпоследним пересечением есть допустим 10 баров и от точки последнего пересечения до минимума есть заданное количество пунктов . уже третьи сутки бьюсь ничего не получается
    MQL код:

    //+------------------------------------------------------------------+
    //| test.mq4 |
    //| Copyright 2017, MetaQuotes Software Corp. |
    //| [url]https://www.mql5.com[/url] |
    //+------------------------------------------------------------------+

    #property copyright "Copyright 2017, MetaQuotes Software Corp."
    #property link "https://www.mql5.com"
    #property version "1.00"
    #property strict



    enum ENUM_YESNO
    {
    YES,
    NO
    };




    extern int FMa=4; // Fast MA
    extern int SMa=52; // Slow MA
    extern int MinTHP=120;
    extern int MaxTHP=700;
    extern int CountBar=20; // количество баров между MA
    input ENUM_YESNO FiltrSignalBigTF = NO;
    input ENUM_TIMEFRAMES TF=PERIOD_CURRENT;
    input ENUM_TIMEFRAMES TFBig=PERIOD_H1;
    extern double CloseProfit = 30 ;
    extern int MaxOpenOrders=100;// Максимальное колличество ордеров 0 -неограничено




    extern string trade2_="Настройки торговли Общие";
    extern int Magic=777; // Магический номер
    extern int Slippage=0; // Проскальзывание
    extern bool MarketWatch=false; // Режим торговли по MarketWatch true = сначала выставляются позиции/ордера без стопов, потом происходит модификация - для некоторых брокеров
    extern bool ClosePosifChange=false; // Закрывать позиции при обратном сигнале
    extern bool CloseEndDay=false; // Закрывать все ордера в конце дня с понедельника по четверг включительно с 23:50 в пятницу с 22:50

    extern string autolot_="Настройки автолота";
    extern double Lots=0.1; // Фиксирвоанный лот
    extern bool DynamicLot=true ; // Динамический лот
    extern double LotBalPcnt=0.5; // % от депозита
    extern double MinLot = 0.1; // Минимальный лот при расчете
    extern double MaxLot = 100; // Максимальный лот при расчете
    extern double Martin=1; // Если 1 то не используется, Коэффициент мартина на следующую сделку после убытончой

    extern string autolot_1="Настройки увеличения процента после серии убыточных ордеров";
    extern ENUM_YESNO PrcUv=NO;
    extern double FactorPercent=2; // коефициент умножения стартового процента
    extern int NumberCloseOrder=20; // количество ордеров в закрытой серии минимум


    extern string timetrade_="Настройки времени торговли";
    extern int OpenHour=0; // Час открытия торгов
    extern int OpenMinute=0; // Минута открытия торгов
    extern int CloseHour=23; // Час закрытия торгов
    extern int CloseMinute=59; // Минута закрытия торгов


    int timeCheckSignal; // Время открытия позиции
    double sll,tpp; // Для вычисления стопов

    int NumberBar;
    int NumberBarVhera;
    string Signal="No Signal";
    double PriceBuy=0.0; // цена пересечения МА для сигнала на Buy
    double PriceSell=0.0; // цена пересечения МА для сигнала на Sell
    double MaxHigh=0.0; // цена бара с максимальным значением между пересечениями двух МА
    double MinLow=0.0; // цена бара с минимальным значением между пересечениями двух МА
    int MaxHighBar; // номер бара с максимальным значением между пересечениями двух МА
    int MinLowBar; // номер бара с минимальным значением между пересечениями двух МА
    datetime timevhera;
    int HighIndexMP3Sell; // индекс бара максимума прошлого дня
    int LowIndexMP3Buy; // индекс бара минимума прошлого дня
    double HighMP3Sell; // цена максимума вчерашнего дня для MP3 на SELL
    double LowMP3Buy; // цена минимума вчерашнего дня для MP3 на Buy
    int CountBarVheraSeg; // количество баров за сегодня и вчера для расчета максимума учитывается в диапазоне для расчета
    double MaxPriceSegodny=0.0; // максимальное значение цены за сегодня
    double MinPriceSegodny=0.0; // минимальное значение цены за сегодня
    datetime TimeBar; //Дата бара первого пересечения
    double Profit=0.0; //Профит по открытым позициям
    int CountBarBigTF = 0; // Номер бара последнего пересечения на старшем таймфрейме
    bool NoBanTradeToday = true ; // запрет торговли сегодня
    double mas=0.0;
    double maf=0.0;
    double mas_p=0.0;
    double maf_p=0.0;
    int MinBarOtRU3;
    int MaxBarOtRU3;
    double MinPriceRU3=0.0; // Минимальная цена от нулевого бара до минимума между MA
    double MaxPriceRU3=0.0; // Максимальная цена от нулевого бара до максимума между MA
    //========= Переменные для индикатора ===========//

    double val1;
    double val2;
    double up = 0.0;
    double down =0.0;
    double upnazad=0.0;
    double downnazad=0.0;
    //=============================================//
    bool OpenBuy=false;
    bool OpenSell=false;
    bool OpenBuyPerezaxod=false;
    bool OpenSellPerezaxod=false;
    double gd_84 = 0.0;
    double gd_92 = 0.0;
    double LotBalancePcnt=0.0;

    // Временные переменные


    bool NewSignalBuy=false;
    bool NewSignalSell=false;
    double PriceNewSignalBuy=0.0;
    double PriceNewSignalSell=0.0;

    datetime TimePros; // время максимальной просадки

    //+------------------------------------------------------------------+
    //| Expert initialization function |
    //+------------------------------------------------------------------+
    int OnInit()
    {
    //---

    //---
    return(INIT_SUCCEEDED);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
    {
    //---

    }
    //+------------------------------------------------------------------+
    //| Expert tick function |
    //+------------------------------------------------------------------+
    void OnTick()
    {
    //---
    if (gd_84 > AccountProfit()){ gd_84 = AccountProfit(); TimePros=TimeCurrent();}
    if (gd_92 < AccountProfit()) gd_92 = AccountProfit();
    //---

    //Найдем день недели
    int DayWeek=TimeDayOfWeek(TimeCurrent());

    //Сегодняшний день
    datetime timsegodny=TimeCurrent();
    MqlDateTime time;
    time.year=TimeYear(TimeCurrent()); // год
    time.mon=TimeMonth(TimeCurrent()); // месяц
    time.day=TimeDay(TimeCurrent()); // день
    time.hour=0; // час
    time.min=0; // минуты
    timsegodny=StructToTime(time);

    // Количество баров от начала дня сегодня //
    NumberBar=iBarShift(Symbol(),TF,timsegodny);

    //--------------------------------------//

    CountBarBigTF = NumberLastBarMaTF(FMa,SMa,TFBig,1,100000); // номе бара последнего пересечения на старшем таймфрейме

    // сегодняшний день 2
    datetime timeseg=TimeCurrent();

    MqlDateTime seg;
    TimeToStruct(timeseg,seg);
    seg.hour=0; // час
    seg.min=0; // минуты
    timeseg=StructToTime(seg);

    // Вчерашний день
    if(DayWeek==1){timevhera=TimeCurrent()-72*60*60;}
    if(DayWeek==2 || DayWeek==3 ||DayWeek==4 ||DayWeek==5) {timevhera=TimeCurrent()-24*60*60;}
    MqlDateTime vhera;
    TimeToStruct(timevhera,vhera);
    vhera.hour=0; // час
    vhera.min=0; // минуты
    timevhera=StructToTime(vhera);

    // Количество баров от начала вчерашнего дня //
    NumberBarVhera=iBarShift(Symbol(),TF,timevhera);
    CountBarVheraSeg=NumberBarVhera-NumberBar;

    // Найдем максимум и минимум прошлого дня

    HighIndexMP3Sell=iHighest(Symbol(),TF,MODE_HIGH,Co untBarVheraSeg,NumberBar); // получаем индекс бара максимума прошлого дня
    LowIndexMP3Buy=iLowest(Symbol(),TF,MODE_LOW,CountB arVheraSeg,NumberBar); // получаем индекс бара минимума прошлого дня







    // если есть сегодня одно пересечение растояние между первым и предыдущим пересечением
    // и расстояние между двумя пересечениями достаточное то вычисляем цену пересечения
    if (BarMa(FMa,SMa,1,NumberBar)>0 && BarMa(FMa,SMa,2,NumberBar+1000)-BarMa(FMa,SMa,1,NumberBar)>CountBar /*&& TimeBar*/ ){
    // проверим пересечение Ma
    mas=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,1); // Slow MA shifted on 1 Period
    maf=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,1); // Fast MA shifted on 1 Period
    mas_p=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,2); // Slow MA shifted on 2 Period
    maf_p=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,2); // Fast MA shifted on 2 Period

    }


    //+++++++++++++++++++++++ Конец OnTick() ++++++++++++++++++++++++
    Comment (
    //"Signal === ",Signal+" \n"+
    // " Количество закрытых ордеров подряд == ",CountInHistoryCloseOrder(Symbol(),-1,Magic)+" \n"+
    // "Дата закрытия последнего ордера == ",GetDateCloseLastPos(Symbol(),-1,Magic)+" \n"+
    //"Profit == ",Profit+" $\n"+
    "Максимальный Профит =",DoubleToStr(gd_92,2)+" $\n"+
    "Минимальная Просадка + ="+DoubleToStr(gd_84,2)+" ___ "+ TimePros+" \n"+
    " Количество пересечений сегодня = "+CountPeresehMa(FMa,SMa,NumberBar)+" \n"+
    // "Номер бара Sell = "+ FirstBarRu3(Symbol(),CountPeresehMa(FMa,SMa,Number Bar),"Sell")+" \n"+
    "Номер бара Buy = "+ FirstBar(Symbol(),CountPeresehMa(FMa,SMa,NumberBar ),"Buy")


    );

    }

    //+------------------------------------------------------------------+
    //| Возвращает номер бара последнего пересечения MA |
    //+--------------------------------------------------------------------+
    //+----------------------------------------------------------------------------+
    //| Параметры:
    //| sy - наименование инструмента ("" - любой символ,
    //| countperes - общее количество пересечений для поиска
    //| signal - сигнал который ищем значение может быть Buy или Sell
    //+----------------------------------------------------------------------------+


    int FirstBar(string sy="",int countperes=0, string signal="")
    {
    int startbarBuy, endbarBuy,startbarSell, endbarSell ;
    int bar;

    if (sy=="0") sy=Symbol();
    if (_Symbol==sy || sy=="")
    {
    if( signal=="Buy")
    {
    // Проверяем если есть сегодня пересечение
    if(BarMa(FMa,SMa,1,NumberBar)>0 ) // возвращает бар последнего пересечения

    {
    for ( int i=1; i<countperes ; i++)
    {


    //если есть пересечение Ma сегодня и Если расстояние между последними пересечениями больше CountBar и высота больше или равна MinTHP и меньше или равно MaxTHP
    if (BarMa(FMa,SMa,countperes,NumberBar)>0 && (BarMa(FMa,SMa,i+1,NumberBar+1000)-BarMa(FMa,SMa,i,NumberBar))>CountBar)
    {


    startbarBuy =BarMa(FMa,SMa,i,NumberBar);// номер бара первого пересечения
    endbarBuy= BarMa(FMa,SMa,i+1,NumberBar+1000); // номер бара второго пересечения

    // проверим пересечение Ma
    mas=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,startbar Buy); // Slow MA shifted on 1 Period
    maf=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,startbar Buy); // Fast MA shifted on 1 Period
    mas_p=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,startb arBuy+1); // Slow MA shifted on 2 Period
    maf_p=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,startb arBuy+1); // Fast MA shifted on 2 Period

    // получим цену пересечения Ma и расщитаем есть ли Значения больше ТНР и Меньше MaxTHP
    if((maf>=mas && maf_p<=mas_p))
    {
    PriceBuy=NormalizeDouble(mas,5); // цена пересечения МА для сигнала на Buy

    // Найдем Минимум среди баров пересечения двух точек
    MinLowBar= iLowest(Symbol(),TF,MODE_LOW, endbarBuy,startbarBuy); // номер бара с минимальным значением между пересечениями двух МА
    MinLow=NormalizeDouble(iLow(Symbol(),TF,MinLowBar) ,5);// цена бара с минимальным значением между пересечениями двух МА
    // Расщитаем растояние от точки начала разворота до конца разворота
    if((PriceBuy-MinLow)/Point>= MinTHP && (PriceBuy-MinLow)/Point<=MaxTHP)
    {
    bar=startbarBuy;
    break;
    }
    }

    }
    }
    }
    }

    if( signal=="Sell")
    {
    // Проверяем если есть сегодня пересечение
    if(BarMa(FMa,SMa,1,NumberBar)>0 ) // возвращает бар последнего пересечения
    {
    for ( int i=1; i<countperes ; i++)
    {


    //если есть пересечение Ma сегодня и Если расстояние между последними пересечениями больше CountBar и высота больше или равна MinTHP и меньше или равно MaxTHP
    if (BarMa(FMa,SMa,countperes,NumberBar)>0 && (BarMa(FMa,SMa,i+1,NumberBar+1000)-BarMa(FMa,SMa,i,NumberBar))>CountBar)
    {

    startbarSell=BarMa(FMa,SMa,i,NumberBar); // номер бара первого пересечения
    endbarSell=BarMa(FMa,SMa,i+1,NumberBar+1000); // номер бара второго пересечения

    // проверим пересечение Ma
    mas=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,startbar Sell); // Slow MA shifted on 1 Period
    maf=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,startbar Sell); // Fast MA shifted on 1 Period
    mas_p=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,startb arSell+1); // Slow MA shifted on 2 Period
    maf_p=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,startb arSell+1); // Fast MA shifted on 2 Period

    // получим цену пересечения Ma и расщитаем есть ли Значения больше ТНР и Меньше MaxTHP
    if((maf<=mas && maf_p>=mas_p))
    {
    PriceSell=NormalizeDouble(mas_p,5); // цена пересечения МА для сигнала на Sell

    // Найдем Максимум среди баров пересечения двух точек
    MaxHighBar= iHighest(Symbol(),TF,MODE_HIGH, endbarSell,startbarSell); // номер бара с максимальным значением между пересечениями двух МА
    MaxHigh= NormalizeDouble(iHigh(Symbol(),TF,MaxHighBar),5); // цена бара с максимальным значением между пересечениями двух МА
    // Расщитаем растояние от точки начала разворота до конца разворота
    if((MaxHigh-PriceSell)/Point>=MinTHP && (MaxHigh-PriceSell)/Point<= MaxTHP)
    {
    bar=startbarSell;
    break;
    }
    }

    }
    }
    }
    }

    if (BarMa(FMa,SMa,1,NumberBar)<0) bar = -1;
    }
    return(bar);
    }





    //+------------------------------------------------------------------+
    //| Возвращает количество пересечений за N-баров |
    //+--------------------------------------------------------------------+
    //+----------------------------------------------------------------------------+
    //| Параметры:
    //| F_Ma - Быстрая MA
    //| S_Ma - Медленная MA
    //| countper - Какое по счету пересечение MA искать
    //| barovSearh - Количество баров для поиска
    //+----------------------------------------------------------------------------+

    int CountPeresehMa(int F_Ma=0, int S_Ma=0 , int barovSearh=0)
    {
    int bar, count;
    double mas2, maf2,
    mas_p2, maf_p2;
    bool flag=false;


    for(count=0, bar=0; bar<=barovSearh; bar++) // Начинаем с послнего бара
    {
    mas2=iMA(Symbol(),0,S_Ma,0,MODE_SMA,PRICE_CLOSE,ba r); // Slow MA shifted on 1 Period
    maf2=iMA(Symbol(),0,F_Ma,0,MODE_SMA,PRICE_CLOSE,ba r); // Fast MA shifted on 1 Period
    mas_p2=iMA(Symbol(),0,S_Ma,0,MODE_SMA,PRICE_CLOSE, bar+1); // Slow MA shifted on 2 Period
    maf_p2=iMA(Symbol(),0,F_Ma,0,MODE_SMA,PRICE_CLOSE, bar+1); // Fast MA shifted on 2 Period

    if((maf2>=mas2 && maf_p2<=mas_p2) ||
    (maf2<=mas2 && maf_p2>=mas_p2))
    {

    count++;


    }
    }
    return(count);
    }

    //+------------------------------------------------------------------+
    //| Поиск пересечений MA указанное количество |
    //+------------------------------------------------------------------+
    //+----------------------------------------------------------------------------+
    //| Параметры:
    //| F_Ma - Быстрая MA
    //| S_Ma - Медленная MA
    //| countper - Какое по счету пересечение MA искать
    //| barovSearh - Количество баров для поиска
    //+----------------------------------------------------------------------------+

    int BarMa(int F_Ma=0, int S_Ma=0, int countper=0 , int barovSearh=0)
    {
    int bar, count;
    double mas2, maf2,
    mas_p2, maf_p2;
    bool flag=false;

    for(count=0, bar=1; bar<barovSearh+1; bar++) // Начинаем с послнего бара
    {
    mas2=iMA(Symbol(),0,S_Ma,0,MODE_SMA,PRICE_CLOSE,ba r); // Slow MA shifted on 1 Period
    maf2=iMA(Symbol(),0,F_Ma,0,MODE_SMA,PRICE_CLOSE,ba r); // Fast MA shifted on 1 Period
    mas_p2=iMA(Symbol(),0,S_Ma,0,MODE_SMA,PRICE_CLOSE, bar+1); // Slow MA shifted on 2 Period
    maf_p2=iMA(Symbol(),0,F_Ma,0,MODE_SMA,PRICE_CLOSE, bar+1); // Fast MA shifted on 2 Period

    if((maf2>=mas2 && maf_p2<=mas_p2) ||
    (maf2<=mas2 && maf_p2>=mas_p2))
    {
    flag=true;
    count++;


    if(count == countper) break; // 5 линий есть - выход
    }

    }
    if (flag==false) bar= -1;
    return(bar);
    }

    //+------------------------------------------------------------------+
    //+--------------------------------------------------------------------+
    //| Возвращает бар на котором было последнее пересечений MA |
    //+--------------------------------------------------------------------+
    //+----------------------------------------------------------------------------+
    //| Параметры:
    //| F_Ma - Быстрая MA
    //| S_Ma - Медленная MA
    //| countper - Какое по счету пересечение MA искать
    //| barovSearh - Количество баров для поиска
    //| bigtf - таймфрейм
    //+----------------------------------------------------------------------------+

    int NumberLastBarMaTF(int F_Ma=0, int S_Ma=0,datetime tf=PERIOD_CURRENT, int countper=0 , int barovSearh=0)
    {
    int bar, count;
    double mas1, maf1,
    mas_p1, maf_p1;
    int NumBar=0;
    bool flag=false;


    for(count=0, bar=0; bar<barovSearh; bar++) // Начинаем с послнего бара
    {
    mas1=iMA(Symbol(),tf,S_Ma,0,MODE_SMA,PRICE_CLOSE,b ar); // Slow MA shifted on 1 Period
    maf1=iMA(Symbol(),tf,F_Ma,0,MODE_SMA,PRICE_CLOSE,b ar); // Fast MA shifted on 1 Period
    mas_p1=iMA(Symbol(),tf,S_Ma,0,MODE_SMA,PRICE_CLOSE ,bar+1); // Slow MA shifted on 2 Period
    maf_p1=iMA(Symbol(),tf,F_Ma,0,MODE_SMA,PRICE_CLOSE ,bar+1); // Fast MA shifted on 2 Period

    if(maf1>=mas1 && maf_p1<=mas_p1) {
    NumBar = bar; //BUY
    count++;
    if(count == countper) break; // 5 линий есть - выход
    }

    if (maf1<=mas1 && maf_p1>=mas_p1){
    NumBar = bar; //SELL
    count++;
    if(count == countper) break; // 5 линий есть - выход
    }

    }

    return(NumBar);
    }

    //+--------------------------------------------------------------------+
    //| Поиск пересечений MA указанное количество возвращает бай или селл |
    //+--------------------------------------------------------------------+
    //+----------------------------------------------------------------------------+
    //| Параметры:
    //| F_Ma - Быстрая MA
    //| S_Ma - Медленная MA
    //| countper - Какое по счету пересечение MA искать
    //| barovSearh - Количество баров для поиска
    //| bigtf - таймфрейм
    //+----------------------------------------------------------------------------+

    string BarMaBigTF(int F_Ma=0, int S_Ma=0,datetime bigtf=PERIOD_CURRENT, int countper=0 , int barovSearh=0)
    {
    int bar, count;
    double mas1, maf1,
    mas_p1, maf_p1;
    string sig="На этом участке нет пересечений";
    bool flag=false;
    // ObjectsDeleteAll(); // Удалить вертикальные линии

    for(count=0, bar=0; bar<barovSearh; bar++) // Начинаем с послнего бара
    {
    mas1=iMA(Symbol(),bigtf,S_Ma,0,MODE_SMA,PRICE_CLOS E,bar); // Slow MA shifted on 1 Period
    maf1=iMA(Symbol(),bigtf,F_Ma,0,MODE_SMA,PRICE_CLOS E,bar); // Fast MA shifted on 1 Period
    mas_p1=iMA(Symbol(),bigtf,S_Ma,0,MODE_SMA,PRICE_CL OSE,bar+1); // Slow MA shifted on 2 Period
    maf_p1=iMA(Symbol(),bigtf,F_Ma,0,MODE_SMA,PRICE_CL OSE,bar+1); // Fast MA shifted on 2 Period

    if(maf1>=mas1 && maf_p1<=mas_p1) {
    sig ="Buy"; //BUY
    count++;
    if(count == countper) break; // 5 линий есть - выход
    }

    if (maf1<=mas1 && maf_p1>=mas_p1){
    sig ="Sell"; //SELL
    count++;
    if(count == countper) break; // 5 линий есть - выход
    }

    }

    return(sig);
    }

    Сообщение от missha32 Посмотреть сообщение
    ....возвращает бар последнего пересечения MA...
    Ты то сам, как себе представляешь пересечение численного значения индикатора с интервалом времени? Этих пересечений может быть и много. Поэтому предлагаю, подумать над условием. Понаблюдать за графиком и понять, что на самом деле происходит, в отличии от того, что ты себе представляешь.

    Комментарий

    • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
    • #3 Свернуть

      Сообщение от missha32 Посмотреть сообщение
      уже третьи сутки бьюсь ничего не получается
      Возможно потому-что ты ведёшь подсчёт задом наперед... Попробуй на оборот

      Комментарий

      Сейчас онлайн

      working...
      X