Logo

Вход

Войти с помощью соц. сетей
Пока нет объявлений.
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
ТОП СООБЩЕНИЙ
16.09.2017, 21:47
Лучший ответ
Выплачено: 428 RUB
По посту не понятно, в каком месте и с какой логикой вы хотите изменить донного сову.
Прошёлся бегло по коду и не совсем понял, как определяется канал и его верхние/нижние границы?
Пожалуйста, опишите сову, покажите скриншоты работы совы и на этих же скриншотах покажите, чего вы хотели бы добавить в сову.
Если вопрос будет понятен и интересен, я помогу вам в его решении
  • #1 Свернуть

    Доработка советника

    Здравствуйте. Помогите прописать условие правильно:

    - цена ниже нижней границы канала
    - после пробития канала УЖЕ был должный сигнал
    - цена достигла минимального Low после выхода из канала, отмеченного ранее сигналом
    - границы канала (и центральная) не меняли направление

    Код советника:

    MQL код:
    #define MAGIC 29062006

    //Параметры индикатора
    extern string Indicator_File = "3 in 1 Alert"; //Индикатор 3 in 1 Alert
    extern int HalfLength = 48; //Период
    //extern int MA_MODE = 0;
    extern int PRICE_MODE = 0; //Тип цены
    extern int ATR_PERIOD = 100; //Период ATR
    extern double K = 2.0; //Ширина канала
    //extern bool ATR_MODE = false;

    //Параметры эксперта
    extern string Ekspert = "ArrowK"; //Эксперт ArrowK
    extern int RiskMax = 10; //Максимальный риск (%)
    extern double LotsMax = 0.01; //Максимальный размер лота
    extern int DecreaseFactor = 6;
    input bool stoploss = false; //СтопЛосс разрешен
    extern int StopLoss = 100; //СтопЛосс
    input bool trail = false; //Трейлингстоп разрешен
    extern int TrailingStop = 200; //Размер стоп ордера
    extern int TrailingStep = 100; //Шаг перемещения
    extern bool AutoClose =true;//выключатель

    double Al_1,Al_2,Al_3,Al_4,Al_5,sl;
    //+------------------------------------------------------------------+
    //Расчет оптимального размера лота
    double LotsOptimized()
    {
    double Lots=NormalizeDouble(AccountBalance()*RiskMax/(100000.0*Ask),1);
    if(AccountFreeMargin()<(1000*Ask*Lots))
    {
    Lots=NormalizeDouble(AccountFreeMargin()*RiskMax/(100000.0*Ask),1);
    }
    if(Lots>LotsMax)
    {
    Lots=LotsMax;
    Print("Превышен максимальный размер лота. Размер лота изменен на ",LotsMax);
    }

    int orders=HistoryTotal();
    int losses=0;

    if(DecreaseFactor>0)
    {
    for(int i=orders-1;i>=0;i--)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==fals e)
    {
    Print("Ошибка в истории!");
    break;
    }
    if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC || OrderType()>OP_SELL)continue;
    if(OrderProfit()>0) break;
    if(OrderProfit()<0) losses++;
    }
    if(losses>1)
    {
    Lots=NormalizeDouble(Lots/(DecreaseFactor*losses),1);
    }
    }
    if(Lots<MarketInfo(Symbol(),MODE_MINLOT))
    {
    Lots=MarketInfo(Symbol(),MODE_MINLOT);
    }
    double raznica = MathMod(Lots,MarketInfo(Symbol(),MODE_LOTSTEP));
    if(raznica>0.0)
    {
    Lots -= raznica;
    }
    return(Lots);
    }
    //+------------------------------------------------------------------+
    bool symbolOrders()
    {
    int orders = OrdersTotal();
    for(int i=orders-1; i>=0; i--)
    {
    if(!OrderSelect(i, SELECT_BY_POS ))
    {
    Print("OrderSelect( ", i, ", SELECT_BY_POS ) - Error #", GetLastError());
    continue;
    }
    if(OrderSymbol()==Symbol())
    {
    if(OrderMagicNumber()==MAGIC)
    {
    return(true);
    }
    }
    }
    return(false);
    }
    //+------------------------------------------------------------------+
    int start()
    {
    int cnt, ticket;
    int total=OrdersTotal();

    if(Bars<100)
    {
    Print("Количество баров меньше 100");
    return(0);
    }

    Al_1=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,0,0);
    Al_2=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,1,0);
    Al_3=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,2,0);
    Al_4=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,3,0);
    Al_5=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,4,0);

    if(!symbolOrders())
    {
    if(AccountFreeMargin()<(1000*LotsOptimized()))
    {
    Print("У Вас недостаточно денег. Свободной маржи = ", AccountFreeMargin());
    return(0);
    }
    if(Al_1>=Al_2)
    {
    if(!IsTradeAllowed())
    {
    Print("BUY: Торговый поток занят.");
    return(0);
    }
    if(!stoploss) sl=NULL; else sl=NormalizeDouble(Ask-StopLoss*Point,Digits);
    {
    ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),A sk,3,sl,0,"",MAGIC,0,CLR_NONE);
    }
    if(ticket>0)
    {
    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES ))
    {
    Print("Открыта позиция на покупку по сигналу BUY: ",OrderOpenPrice());
    }
    else
    {
    Print("Ошибка открытия позиции на покупку по сигналу BUY: ",GetLastError());
    return(0);
    }
    }
    }

    if(Al_3<=Al_2)
    {
    if(!IsTradeAllowed())
    {
    Print("SELL: Торговый поток занят.");
    return(0);
    }
    if(!stoploss) sl=NULL; else sl=NormalizeDouble(Bid+StopLoss*Point,Digits);
    {
    ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(), Bid,3,sl,0,"",MAGIC,0,CLR_NONE);
    }
    if(ticket>0)
    {
    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES ))
    {
    Print("Открыта позиция на продажу по сигналу SELL: ",OrderOpenPrice());
    }
    else
    {
    Print("Ошибка открытия позиции на продажу по сигналу SELL: ",GetLastError());
    return(0);
    }
    }
    }
    }

    //********* Закрытие позиций ****************************************
    if (AutoClose) {
    //----переменные для закрытия позиций ----
    Al_1=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,0,0);
    Al_2=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,1,0);
    Al_3=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,2,0);
    Al_4=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,3,0);
    Al_5=iCustom(NULL,0,"3 in 1 Alert",HalfLength,PRICE_MODE,ATR_PERIOD,K,4,0);
    //----------------------------------------------------------------------
    for (int v=0; v<OrdersTotal(); v++) {
    if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES)) {
    if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MAGIC) {
    //-----------------------------------------------------
    if (OrderType() == OP_BUY) {
    if
    (Al_3<=Al_2) {
    OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
    return(0); // выходим
    }
    }
    //--------------------------------------------------------
    if (OrderType() == OP_SELL) {
    if
    (Al_1>=Al_2) {
    OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
    return(0); // выходим
    }
    }
    //-------------------------------------------------------
    } // Symbol()
    } // select
    } //total
    } //Close_
    //+------------------------------------------------------------------+
    if(trail==true)
    {
    Trailling();
    }
    //+------------------------------------------------------------------+
    return(0);
    }
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    По посту не понятно, в каком месте и с какой логикой вы хотите изменить донного сову.
    Прошёлся бегло по коду и не совсем понял, как определяется канал и его верхние/нижние границы?
    Пожалуйста, опишите сову, покажите скриншоты работы совы и на этих же скриншотах покажите, чего вы хотели бы добавить в сову.
    Если вопрос будет понятен и интересен, я помогу вам в его решении

    Комментарий

    working...
    X