Заработай до
50000$
на приглашении друзей
получить StartUp Bonus
от ИнстаФорекс
Вложений не требуется!
Начни торговлю
без вложений и риска
С новым STARTUP бонусом 1000$
Получи бонус
55%
от ИнстаФорекс
на каждое пополнение
Ответить в теме

Показаны сообщения: с 1 по 16 из 16

Тема: Цикличное закрытие всех ордеров по средствам(закрывашка по эквити).

 Перейти в классический вид темы
     
  1. ТОП сообщений
    2018-04-16   16:58
    Лучший ответ #1
    Накопленные выплаты 24584 RUB

    Цитата Сообщение от Дмитрий Александрович Посмотреть сообщение
    ВОТ:

    А.. вот оно.. Но позвольте. Это есть не то, чего вы описывали. Данный советник закрывает все ордера когда сумма превысит установленное значение. Ни о каком накоплении здесь речи нет. Ну и, собственно, изменений-то всего ничего.. Сморим ниже.
    [PHP]double DesiredEquityPlus=10;
    extern string Text = "ЗАКРЫТИЕ ОРДЕРОВ";
    double DesiredEquity;
    int OnInit() { return(INIT_SUCCEEDED); }
    void OnDeinit(const int reason) {}
    void OnTick() {
    if (OrdersTotal()==0) DesiredEquity = AccountEquity();
    else if (AccountEquity() >= DesiredEquity+DesiredEquityPlus) {
    for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS)) {
    if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
    double price = 0;
    if (OrderType() == OP_BUY) price = MarketInfo(OrderSymbol(), MODE_BID);
    if (OrderType() == OP_SELL) price = MarketInfo(OrderSymbol(), MODE_ASK);
    bool cls = false;
    while(!cls) cls = OrderClose(OrderTicket(), OrderLots(), price, 100, Black);
    Alert(Text);
    }
    }
    }
    }
    }
    [/PHP]

    2018-04-20   16:09
    Лучший ответ #2

    Заметил что если нет отложенных ордеров,то закрывает ордера сразу после открытия.Нужно исправить.

    2018-04-16   18:13
    Лучший ответ #3
     

    Цитата Сообщение от work2it Посмотреть сообщение

    Мур.)
    Одно из возможных решений. У Вашего много минусов в том плане, что возрастают затраты на обработку всего этого. Написать можно проще.

    2018-04-11   16:38
    Лучший ответ #4

    Здравствуйте.Возникла идея создания советника закрывающего все ордера когда увеличатся средства.Например депозит 100$ и средства соответственно 100$,в процессе торговли средства выросли до 110$ и советник закрыл все ордера.Баланс и средства стали по 110$ ,советник запомнил сумму 110 и следующие закрытие будет уже на 120$ по средствам,далее 130$ и т.д. При этом в настройках советника значение 10$(т.е. цикличное закрытие с шагом 10$),если поставить 5$, то соответственно первое закрытие будет когда средства достигнут 105$ ,второе на 110$ далее 115$ и т.д.
    Есть готовый советник закрывающий все ордера по средствам.
    ______________________________
    ВОТ: Вложение 1886663
    Вложение 1886662
    Но закрытие происходит без запоминания значения эквити после закрытия.Т.е. после закрытия на 110$ ,повторное закрытие происходит также на 110$ ,пока в ручную не внесу следующее значение эквити на закрытие.Эту "закрывашку" прошу модернизировать.Такой метод закрытия ордеров будет полезен при автоматической торговли советниками.
    Если у кого нибудь есть такой готовый советник прошу поделиться.

    Вложение
    Превью
    2018-04-20   06:59
    Лучший ответ #5

    Цитата Сообщение от nsemenov Посмотреть сообщение
    PHP код:
    double price = 0; if (OrderType() == OP_BUY)  pric e = MarketInfo(OrderSymbol(), MODE_BID); if (Order Type() == OP_SELL) price = MarketInfo(OrderSymbol( ), MODE_ASK); bool cls = false; while(!cls) cls =  OrderClose(OrderTicket(), OrderLots(), price, 100,  Black); 
    Все это можно сократить:
    PHP код:
    cls = OrderClose(OrderTicket(), OrderLots(), Marke tInfo(OrderSymbol(), OrderType() + 9), 100, Black) ;
    Так?
    [PHP]extern double DesiredEquityPlus=10; // Шаг закрытия
    extern string Text = "ЗАКРЫТИЕ ОРДЕРОВ";
    double DesiredEquity;
    int OnInit() { return(INIT_SUCCEEDED); }
    void OnDeinit(const int reason) {}
    void OnTick() {
    if (OrdersTotal()==0) DesiredEquity = AccountEquity();
    else if (AccountEquity() >= DesiredEquity+DesiredEquityPlus) {
    for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS)) {
    if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
    bool cls = false;
    while(!cls) cls = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), OrderType() + 9), 100, Black);
    Alert(Text);
    }
    }
    }
    }
    }
    [/PHP]
    Есть вот такая ещё "закрывашка с тралом",но прибыль в процентном соотношении.
    [PHP]extern double Total_Profit_Start = 5000; //Сумма в USD от которой стартовать трал по Профиту
    extern double Profit_Percent = 1; //% Процент профита для старта трала
    extern double Profit_Rollback = 0.5; //% Процент отката для закрытия всех ордеров
    double EquityStart=0;
    bool Trall=false;
    int slippage=1000;
    //--------------------------------------------------------------------
    int init()
    {
    double AE = AccountEquity();
    EquityStart=AE+AE/100*Profit_Percent;
    return(0);
    }
    //+------------------------------------------------------------------+
    int start()
    {
    if (!IsTradeAllowed()) return(0);
    double AB = AccountBalance();
    double AE = AccountEquity();
    DrawLABEL("Balance",1,5,20,Lime,StringConcatenate( "Balance ",DoubleToStr(AB,2)));
    DrawLABEL("Equity" ,1,5,40,Lime,StringConcatenate("Equity ",DoubleToStr(AE,2)));
    if (OrdersTotal()==0) {Trall=false;EquityStart=AE+AE/100*Profit_Percent;}
    if (!Trall)
    {
    DrawLABEL("Equity Start",1,5,60,Lime,StringConcatenate("Equity Start Trall ",DoubleToStr(MathMax(EquityStart,Total_Profit_Sta rt),2)));
    if (AE>=EquityStart && AE>=Total_Profit_Start) //запуск тралла по эквити
    {
    EquityStart=AE+AE/100*Profit_Percent;
    Alert("Запуск трейлинга Equity, Equity = "+DoubleToStr(AE,2));
    Trall=true;
    }
    }
    if (Trall)
    {
    if (EquityStart<AE+AE/100*Profit_Percent) EquityStart=AE+AE/100*Profit_Percent;
    DrawLABEL("Equity Start",1,5,0,Red,StringConcatenate("Трал Equity закрытие при ",DoubleToStr(EquityStart-EquityStart/100*Profit_Rollback,2)));
    if (AE<=EquityStart-EquityStart/100*Profit_Rollback)
    {
    CloseAll();
    Trall=false;
    AE=AccountEquity();
    EquityStart=AE+AE/100*Profit_Percent;
    }
    return(0);
    }
    return(0);
    }
    //------------------------------------------------------------------
    int deinit()
    {
    if (!IsTesting())
    {
    ObjectsDeleteAll(0);
    }
    return(0);
    }
    //-------------------------------------------------------------------
    void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
    {
    if (ObjectFind(name)!=-1) ObjectDelete(name);
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    ObjectSet(name, OBJPROP_CORNER, CORNER);
    ObjectSet(name, OBJPROP_XDISTANCE, X);
    ObjectSet(name, OBJPROP_YDISTANCE, Y);
    ObjectSetText(name,Name,10,"Arial",clr);
    }
    //+------------------------------------------------------------------+
    color Color(bool P,color a,color b)
    {
    if (P) return(a);
    else return(b);
    }
    //------------------------------------------------------------------
    double CloseAll()
    {
    bool error=true;
    int OMN,nn,OT,Ticket,j;
    double loss=0;
    while(true)
    {
    for (j = OrdersTotal()-1; j >= 0; j--)
    {
    if (OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    OMN=OrderMagicNumber();
    Ticket = OrderTicket();
    if (OT>1) error=OrderDelete(Ticket);
    if (OT==OP_BUY)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDoubl e(MarketInfo(OrderSymbol(),MODE_BID),(int)MarketIn fo(OrderSymbol(),MODE_DIGITS)),slippage,Blue);
    if (error) loss+=OrderProfit();
    }
    if (OT==OP_SELL)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDoubl e(MarketInfo(OrderSymbol(),MODE_ASK),(int)MarketIn fo(OrderSymbol(),MODE_DIGITS)),slippage,Red);
    if (error) loss+=OrderProfit();
    }
    }
    }
    int n=0;
    for (j = 0; j < OrdersTotal(); j++)
    {
    if (OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    n++;
    }
    }
    if (n==0) break;
    nn++;
    if (nn>10)
    {
    Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",n);
    return(loss);
    }
    Sleep(1000);
    RefreshRates();
    }
    return(loss);
    }
    //--------------------------------------------------------------------
    [/PHP]
    Советник мне нравиться,выводит информацию на график о сумме средств при следующем закрытии,да и идея схожа с моей.
    Я не силён в программировании, но так сказать на "догадках" изменил код чтобы закрывал по сумме прибыли.
    Только нужно исключить трейлинг,либо сделать чтобы он отключался в настройках.
    Возможно я что то не так изменил,посмотрите верно ли я поменял код,чтобы закрытие ордеров было с шагом по +10$ по средствам.
    [PHP]extern double Total_Profit_Start = 100; //Сумма в USD от которой стартовать трал по Профиту
    extern double Profit_Percent = 10; //% Шаг профита
    extern double Profit_Rollback = 0.1; //% Сумма отката в USD
    double EquityStart=0;
    bool Trall=false;
    int slippage=1000;
    //--------------------------------------------------------------------
    int init()
    {
    double AE = AccountEquity();
    EquityStart=AE+Profit_Percent;
    return(0);
    }
    //+------------------------------------------------------------------+
    int start()
    {
    if (!IsTradeAllowed()) return(0);
    double AB = AccountBalance();
    double AE = AccountEquity();
    DrawLABEL("Balance",1,5,20,Lime,StringConcatenate( "Balance ",DoubleToStr(AB,2)));
    DrawLABEL("Equity" ,1,5,40,Lime,StringConcatenate("Equity ",DoubleToStr(AE,2)));
    if (OrdersTotal()==0) {Trall=false;EquityStart=AE+Profit_Percent;}
    if (!Trall)
    {
    DrawLABEL("Equity Start",1,5,60,Lime,StringConcatenate("Equity Start Trall ",DoubleToStr(MathMax(EquityStart,Total_Profit_Sta rt),2)));
    if (AE>=EquityStart && AE>=Total_Profit_Start) //запуск тралла по эквити
    {
    EquityStart=AE+Profit_Percent;
    Alert("Запуск трейлинга Equity, Equity = "+DoubleToStr(AE,2));
    Trall=true;
    }
    }
    if (Trall)
    {
    if (EquityStart<AE+Profit_Percent) EquityStart=AE+Profit_Percent;
    DrawLABEL("Equity Start",1,5,0,Red,StringConcatenate("Трал Equity закрытие при ",DoubleToStr(EquityStart-EquityStart+Profit_Rollback,2)));
    if (AE<=EquityStart-EquityStart+AE+Profit_Rollback)
    {
    CloseAll();
    Trall=false;
    AE=AccountEquity();
    EquityStart=AE+Profit_Percent;
    }
    return(0);
    }
    return(0);
    }
    //------------------------------------------------------------------
    int deinit()
    {
    if (!IsTesting())
    {
    ObjectsDeleteAll(0);
    }
    return(0);
    }
    //-------------------------------------------------------------------
    void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
    {
    if (ObjectFind(name)!=-1) ObjectDelete(name);
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    ObjectSet(name, OBJPROP_CORNER, CORNER);
    ObjectSet(name, OBJPROP_XDISTANCE, X);
    ObjectSet(name, OBJPROP_YDISTANCE, Y);
    ObjectSetText(name,Name,10,"Arial",clr);
    }
    //+------------------------------------------------------------------+
    color Color(bool P,color a,color b)
    {
    if (P) return(a);
    else return(b);
    }
    //------------------------------------------------------------------
    double CloseAll()
    {
    bool error=true;
    int OMN,nn,OT,Ticket,j;
    double loss=0;
    while(true)
    {
    for (j = OrdersTotal()-1; j >= 0; j--)
    {
    if (OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    OMN=OrderMagicNumber();
    Ticket = OrderTicket();
    if (OT>1) error=OrderDelete(Ticket);
    if (OT==OP_BUY)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDoubl e(MarketInfo(OrderSymbol(),MODE_BID),(int)MarketIn fo(OrderSymbol(),MODE_DIGITS)),slippage,Blue);
    if (error) loss+=OrderProfit();
    }
    if (OT==OP_SELL)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDoubl e(MarketInfo(OrderSymbol(),MODE_ASK),(int)MarketIn fo(OrderSymbol(),MODE_DIGITS)),slippage,Red);
    if (error) loss+=OrderProfit();
    }
    }
    }
    int n=0;
    for (j = 0; j < OrdersTotal(); j++)
    {
    if (OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    n++;
    }
    }
    if (n==0) break;
    nn++;
    if (nn>10)
    {
    Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",n);
    return(loss);
    }
    Sleep(1000);
    RefreshRates();
    }
    return(loss);
    }
    //--------------------------------------------------------------------
    [/PHP]

    2018-04-20   10:46
    Лучший ответ #6

    убрал не нужное,код меньше работает также
    [PHP]
    extern double Profit_Percent = 10; //% Шаг профита
    double EquityStart=0;
    bool Trall=false;
    int slippage=1000;
    //--------------------------------------------------------------------
    int init()
    {
    double AE = AccountEquity();
    EquityStart=AE+Profit_Percent;
    return(0);
    }
    //+------------------------------------------------------------------+
    int start()
    {
    if (!IsTradeAllowed()) return(0);
    double AB = AccountBalance();
    double AE = AccountEquity();
    DrawLABEL("Balance",1,5,20,Green,StringConcatenate ("Баланс ",DoubleToStr(AB,2)));
    DrawLABEL("Equity" ,1,5,40,Green,StringConcatenate("Средства ",DoubleToStr(AE,2)));
    if (OrdersTotal()==0) {Trall=false;EquityStart=AE;}
    if (!Trall)
    {
    DrawLABEL("Equity Start",1,5,60,Lime,StringConcatenate("Закрытие при ",DoubleToStr((EquityStart),2)));
    if (AE>=EquityStart) //запуск тралла по эквити
    {
    Trall=true;
    }
    }
    if (Trall)
    {
    if (EquityStart<AE+Profit_Percent) EquityStart=AE+Profit_Percent;
    DrawLABEL("Equity Start",1,5,60,Red,StringConcatenate("ЗАКРЫТИЕ ОРДЕРОВ ",DoubleToStr(AccountEquity(),2)));
    if (AE<=EquityStart-EquityStart+AE)
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
    if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
    if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol( ),MODE_BID),slippage);
    if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol( ),MODE_ASK),slippage);
    Trall=false;
    AE=AccountEquity();
    EquityStart=AE+Profit_Percent;
    }
    return(0);
    }
    return(0);
    }
    //------------------------------------------------------------------
    int deinit()
    {
    if (!IsTesting())
    {
    ObjectsDeleteAll(0);
    }
    return(0);
    }
    //-------------------------------------------------------------------
    void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
    {
    if (ObjectFind(name)!=-1) ObjectDelete(name);
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    ObjectSet(name, OBJPROP_CORNER, CORNER);
    ObjectSet(name, OBJPROP_XDISTANCE, X);
    ObjectSet(name, OBJPROP_YDISTANCE, Y);
    ObjectSetText(name,Name,10,"Arial",clr);
    }
    //+------------------------------------------------------------------+
    color Color(bool P,color a,color b)
    {
    if (P) return(a);
    else return(b);
    }
    //------------------------------------------------------------------
    [/PHP]

  2. линк#1
    Свой человек
    Все пучком
     
    Дмитрий Александрович приемлемый уровень репутации Дмитрий Александрович приемлемый уровень репутации Аватар для Дмитрий Александрович
    Регистрация:
    08.09.2011
    Сообщений:
    594
    Накопленные выплаты (Подробнее):
    7412 RUB
    Поставил(а) лайков:
    261
    Получено лайков:   163
    в 96 сообщениях
    27%
    Здравствуйте.Возникла идея создания советника закрывающего все ордера когда увеличатся средства.Например депозит 100$ и средства соответственно 100$,в процессе торговли средства выросли до 110$ и советник закрыл все ордера.Баланс и средства стали по 110$ ,советник запомнил сумму 110 и следующие закрытие будет уже на 120$ по средствам,далее 130$ и т.д. При этом в настройках советника значение 10$(т.е. цикличное закрытие с шагом 10$),если поставить 5$, то соответственно первое закрытие будет когда средства достигнут 105$ ,второе на 110$ далее 115$ и т.д.
    Есть готовый советник закрывающий все ордера по средствам.
    ______________________________
    ВОТ: ClosersEquity.mq4

    Название: closeEkvi.PNG
Просмотров: 612

Размер: 19.1 КБ

    Но закрытие происходит без запоминания значения эквити после закрытия.Т.е. после закрытия на 110$ ,повторное закрытие происходит также на 110$ ,пока в ручную не внесу следующее значение эквити на закрытие.Эту "закрывашку" прошу модернизировать.Такой метод закрытия ордеров будет полезен при автоматической торговли советниками.
    Если у кого нибудь есть такой готовый советник прошу поделиться.


  3. post_thanks Получено лайков: 2

    VNS1 (06.05.2018), Незарегистрированный (1 пользователь)

  4. линк#2
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,654
    Накопленные выплаты (Подробнее):
    56347 RUB
    Поставил лайков:
    277
    Получено лайков:   628
    в 568 сообщениях
    38%
    Цитата Сообщение от Дмитрий Александрович Посмотреть сообщение

    Это не "Закрывашка", это "Ждун".
    Поэтому каждый раз и надо устанавливать новое срабатывающее значение.
    Родина мать, не зовёт MQL-программированием заняться?
    Эта идея уже с такой "бородой", что не одно поколение писателей на MQL опробовали своё перо на ней.
    На CodeBase сходите, там Вас ещё и другие идеи посетят, вместе с исходными текстами, комментариями и обсуждениями.


  5. линк#3
    Кандидат форумных наук
    В шоке
     
    work2it хорошая репутация work2it хорошая репутация work2it хорошая репутация Аватар для work2it
    Регистрация:
    01.10.2015
    Пол:
    Мужчина
    Сообщений:
    1,097
    Накопленные выплаты (Подробнее):
    24584 RUB
    Поставил лайков:
    14
    Получено лайков:   216
    в 196 сообщениях
    20%
    Цитата Сообщение от Дмитрий Александрович Посмотреть сообщение
    Есть готовый советник закрывающий все ордера по средствам
    Есть готовый - пользуйтесь. В чем суть вопроса?
    Цитата Сообщение от Дмитрий Александрович Посмотреть сообщение
    Но закрытие происходит без запоминания значения эквити после закрытия.
    Ну так бы сразу и сказал. Показывай код, здесь помогут в коде изменить стартовую суммы при нулевом количестве открытых ордеров. Можно, конечно, написать все сизнова, но ведь лениво, тем более, что тема того не стоит.

    Реализую за ваши деньги ваши идеи на MQL - mql@fx-prog.ru

  6. линк#4
    Кандидат форумных наук
    В шоке
     
    work2it хорошая репутация work2it хорошая репутация work2it хорошая репутация Аватар для work2it
    Регистрация:
    01.10.2015
    Пол:
    Мужчина
    Сообщений:
    1,097
    Накопленные выплаты (Подробнее):
    24584 RUB
    Поставил лайков:
    14
    Получено лайков:   216
    в 196 сообщениях
    20%
    Цитата Сообщение от Дмитрий Александрович Посмотреть сообщение
    А.. вот оно.. Но позвольте. Это есть не то, чего вы описывали. Данный советник закрывает все ордера когда сумма превысит установленное значение. Ни о каком накоплении здесь речи нет. Ну и, собственно, изменений-то всего ничего.. Сморим ниже.
    PHP код:
    double DesiredEquityPlus=10;
    extern string Text = "ЗАКРЫТИЕ ОРДЕРОВ";

    double DesiredEquity;
    int OnInit() { return(INIT_SUCCEEDED); }
    void OnDeinit(const int reason) {}
    void OnTick() {
    if (
    OrdersTotal()==0) DesiredEquity = AccountEquity();
    else if (
    AccountEquity() >= DesiredEquity+DesiredEquityPlus) {
    for (
    int i=OrdersTotal()-1; i>=0; i--) {
    if (
    OrderSelect(i, SELECT_BY_POS)) {
    if (
    OrderType() == OP_BUY || OrderType() == OP_SELL) {
    double price = 0;
    if (
    OrderType() == OP_BUY) price = MarketInfo(OrderSymbol(), MODE_BID);
    if (
    OrderType() == OP_SELL) price = MarketInfo(OrderSymbol(), MODE_ASK);
    bool cls = false;
    while(!
    cls) cls = OrderClose(OrderTicket(), OrderLots(), price, 100, Black);
    Alert(Text);
    }
    }
    }
    }
    }

    Реализую за ваши деньги ваши идеи на MQL - mql@fx-prog.ru

  7. post_thanks Получено лайков: 5

    ppvic (16.04.2018), Незарегистрированный (4 пользователя)

  8. линк#5
    Живая Легенда
    no
     
    ppvic наивысший уровень репутации ppvic наивысший уровень репутации ppvic наивысший уровень репутации ppvic наивысший уровень репутации ppvic наивысший уровень репутации ppvic наивысший уровень репутации ppvic наивысший уровень репутации ppvic наивысший уровень репутации ppvic наивысший уровень репутации ppvic наивысший уровень репутации ppvic наивысший уровень репутации Аватар для ppvic
    Регистрация:
    30.05.2010
    Сообщений:
    31,676
    Накопленные выплаты (Подробнее):
    276261 RUB
    Поставил(а) лайков:
    8,500
    Получено лайков:   21,475
    в 11,823 сообщениях
    68%
    Цитата Сообщение от work2it Посмотреть сообщение

    Мур.)
    Одно из возможных решений. У Вашего много минусов в том плане, что возрастают затраты на обработку всего этого. Написать можно проще.


  9. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)

  10. линк#6
    Кандидат форумных наук
    В шоке
     
    work2it хорошая репутация work2it хорошая репутация work2it хорошая репутация Аватар для work2it
    Регистрация:
    01.10.2015
    Пол:
    Мужчина
    Сообщений:
    1,097
    Накопленные выплаты (Подробнее):
    24584 RUB
    Поставил лайков:
    14
    Получено лайков:   216
    в 196 сообщениях
    20%
    Цитата Сообщение от ppvic Посмотреть сообщение
    Одно из возможных решений. У Вашего много минусов в том плане, что возрастают затраты на обработку всего этого.
    Затраты на обработку мне до лампочки.. Не мне этим пользоваться.. Важны затраты на изменение существующего кода. В моем случае, по сравнению с исходным кодом, добавлена одна строчка кода и одна глобальная переменная. И, кстати, укажите все же, чем эта самая строчка увеличивает затраты на обработку
    PHP код:
    if (OrdersTotal()==0) DesiredEquity = AccountEquity();

    Реализую за ваши деньги ваши идеи на MQL - mql@fx-prog.ru

  11. линк#7
    Свой человек
    Все пучком
     
    Дмитрий Александрович приемлемый уровень репутации Дмитрий Александрович приемлемый уровень репутации Аватар для Дмитрий Александрович
    Регистрация:
    08.09.2011
    Сообщений:
    594
    Накопленные выплаты (Подробнее):
    7412 RUB
    Поставил(а) лайков:
    261
    Получено лайков:   163
    в 96 сообщениях
    27%
    Цитата Сообщение от work2it Посмотреть сообщение
    А.. вот оно.. Но позвольте. Это есть не то, чего вы описывали. Данный советник закрывает все ордера когда сумма превысит установленное значение. Ни о каком накоплении здесь речи нет.
    Да, я об этом написал:

    Цитата Сообщение от Дмитрий Александрович Посмотреть сообщение
    Но закрытие происходит без запоминания значения эквити после закрытия.Т.е. после закрытия на 110$ ,повторное закрытие происходит также на 110$ ,пока в ручную не внесу следующее значение эквити на закрытие.
    Цитата Сообщение от work2it Посмотреть сообщение
    Ну и, собственно, изменений-то всего ничего.. Сморим ниже
    Спасибо!
    Вот готовый советник: закрывашка по средствам с шагом.mq4


  12. линк#8
    Свой человек
    Все пучком
     
    Дмитрий Александрович приемлемый уровень репутации Дмитрий Александрович приемлемый уровень репутации Аватар для Дмитрий Александрович
    Регистрация:
    08.09.2011
    Сообщений:
    594
    Накопленные выплаты (Подробнее):
    7412 RUB
    Поставил(а) лайков:
    261
    Получено лайков:   163
    в 96 сообщениях
    27%
    Цитата Сообщение от Дмитрий Александрович Посмотреть сообщение
    Потестировал, первое закрытие по +10 ,остальные закрывает в ноль.Что то не то.


  13. линк#9
    Частый гость
    nsemenov приемлемый уровень репутации nsemenov приемлемый уровень репутации Аватар для nsemenov
    Регистрация:
    27.06.2017
    Пол:
    Мужчина
    Сообщений:
    81
    Накопленные выплаты (Подробнее):
    3751 RUB
    Поставил лайков:
    18
    Получено лайков:   145
    в 62 сообщениях
    179%
    PHP код:
    double price = 0;
     if (OrderType() == OP_BUY)  price = MarketInfo(OrderSymbol(), MODE_BID);
     if (OrderType() == OP_SELL) price = MarketInfo(OrderSymbol(), MODE_ASK);
     bool cls = false;
     while(!cls) cls = OrderClose(OrderTicket(), OrderLots(), price, 100, Black);
    Все это можно сократить:
    PHP код:
    cls = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), OrderType() + 9), 100, Black);


  14. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)

  15. линк#10
    Свой человек
    Все пучком
     
    Дмитрий Александрович приемлемый уровень репутации Дмитрий Александрович приемлемый уровень репутации Аватар для Дмитрий Александрович
    Регистрация:
    08.09.2011
    Сообщений:
    594
    Накопленные выплаты (Подробнее):
    7412 RUB
    Поставил(а) лайков:
    261
    Получено лайков:   163
    в 96 сообщениях
    27%
    Цитата Сообщение от nsemenov Посмотреть сообщение
    PHP код:

    double price = 0; if (OrderType() == OP_BUY)  pric e = MarketInfo(OrderSymbol(), MODE_BID); if (Order Type() == OP_SELL) price = MarketInfo(OrderSymbol( ), MODE_ASK); bool cls = false; while(!cls) cls =  OrderClose(OrderTicket(), OrderLots(), price, 100,  Black); 



    Все это можно сократить:

    PHP код:

    cls = OrderClose(OrderTicket(), OrderLots(), Marke tInfo(OrderSymbol(), OrderType() + 9), 100, Black) ;
    Так?
    PHP код:
    extern double DesiredEquityPlus=10; // Шаг закрытия
    extern string Text = "ЗАКРЫТИЕ ОРДЕРОВ";
    double DesiredEquity;

    int OnInit() { return(INIT_SUCCEEDED); }
    void OnDeinit(const int reason) {}
    void OnTick() {
    if (
    OrdersTotal()==0) DesiredEquity = AccountEquity();
    else if (
    AccountEquity() >= DesiredEquity+DesiredEquityPlus) {
    for (
    int i=OrdersTotal()-1; i>=0; i--) {
    if (
    OrderSelect(i, SELECT_BY_POS)) {
    if (
    OrderType() == OP_BUY || OrderType() == OP_SELL) {
    bool cls = false;
    while(!
    cls) cls = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), OrderType() + 9), 100, Black);
    Alert(Text);
    }
    }
    }
    }
    }
    Есть вот такая ещё "закрывашка с тралом",но прибыль в процентном соотношении.
    PHP код:
    extern double Total_Profit_Start = 5000; //Сумма в USD от которой стартовать трал по Профиту
    extern double Profit_Percent = 1; //% Процент профита для старта трала
    extern double Profit_Rollback = 0.5; //% Процент отката для закрытия всех ордеров

    double EquityStart=0;
    bool Trall=false;
    int slippage=1000;
    //--------------------------------------------------------------------
    int init()
    {
    double AE = AccountEquity();
    EquityStart=AE+AE/100*Profit_Percent;
    return(
    0);
    }
    //+------------------------------------------------------------------+
    int start()
    {
    if (!
    IsTradeAllowed()) return(0);

    double AB = AccountBalance();
    double AE = AccountEquity();

    DrawLABEL("Balance",1,5,20,Lime,StringConcatenate("Balance ",DoubleToStr(AB,2)));
    DrawLABEL("Equity" ,1,5,40,Lime,StringConcatenate("Equity ",DoubleToStr(AE,2)));

    if (
    OrdersTotal()==0) {Trall=false;EquityStart=AE+AE/100*Profit_Percent;}
    if (!
    Trall)
    {
    DrawLABEL("Equity Start",1,5,60,Lime,StringConcatenate("Equity Start Trall ",DoubleToStr(MathMax(EquityStart,Total_Profit_Start),2)));
    if (
    AE>=EquityStart && AE>=Total_Profit_Start) //запуск тралла по эквити
    {
    EquityStart=AE+AE/100*Profit_Percent;
    Alert("Запуск трейлинга Equity, Equity = "+DoubleToStr(AE,2));
    Trall=true;
    }
    }
    if (
    Trall)
    {
    if (
    EquityStart<AE+AE/100*Profit_Percent) EquityStart=AE+AE/100*Profit_Percent;
    DrawLABEL("Equity Start",1,5,0,Red,StringConcatenate("Трал Equity закрытие при ",DoubleToStr(EquityStart-EquityStart/100*Profit_Rollback,2)));
    if (
    AE<=EquityStart-EquityStart/100*Profit_Rollback)
    {
    CloseAll();
    Trall=false;
    AE=AccountEquity();
    EquityStart=AE+AE/100*Profit_Percent;
    }
    return(
    0);
    }
    return(
    0);
    }
    //------------------------------------------------------------------
    int deinit()
    {
    if (!
    IsTesting())
    {
    ObjectsDeleteAll(0);
    }
    return(
    0);
    }
    //-------------------------------------------------------------------
    void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
    {
    if (
    ObjectFind(name)!=-1) ObjectDelete(name);
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    ObjectSet(name, OBJPROP_CORNER, CORNER);
    ObjectSet(name, OBJPROP_XDISTANCE, X);
    ObjectSet(name, OBJPROP_YDISTANCE, Y);
    ObjectSetText(name,Name,10,"Arial",clr);
    }
    //+------------------------------------------------------------------+
    color Color(bool P,color a,color b)
    {
    if (
    P) return(a);
    else return(
    b);
    }
    //------------------------------------------------------------------
    double CloseAll()
    {
    bool error=true;
    int OMN,nn,OT,Ticket,j;
    double loss=0;
    while(
    true)
    {
    for (
    j = OrdersTotal()-1; j >= 0; j--)
    {
    if (
    OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    OMN=OrderMagicNumber();
    Ticket = OrderTicket();
    if (
    OT>1) error=OrderDelete(Ticket);
    if (
    OT==OP_BUY)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),slippage,Blue);
    if (
    error) loss+=OrderProfit();
    }
    if (
    OT==OP_SELL)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),slippage,Red);
    if (
    error) loss+=OrderProfit();
    }
    }
    }
    int n=0;
    for (
    j = 0; j < OrdersTotal(); j++)
    {
    if (
    OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    n++;
    }
    }
    if (
    n==0) break;
    nn++;
    if (
    nn>10)
    {
    Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",n);
    return(
    loss);
    }
    Sleep(1000);
    RefreshRates();
    }
    return(
    loss);
    }
    //--------------------------------------------------------------------
    Советник мне нравиться,выводит информацию на график о сумме средств при следующем закрытии,да и идея схожа с моей.
    Я не силён в программировании, но так сказать на "догадках" изменил код чтобы закрывал по сумме прибыли.
    Только нужно исключить трейлинг,либо сделать чтобы он отключался в настройках.
    Возможно я что то не так изменил,посмотрите верно ли я поменял код,чтобы закрытие ордеров было с шагом по +10$ по средствам.
    PHP код:
    extern double Total_Profit_Start = 100; //Сумма в USD от которой стартовать трал по Профиту
    extern double Profit_Percent = 10; //% Шаг профита
    extern double Profit_Rollback = 0.1; //% Сумма отката в USD

    double EquityStart=0;
    bool Trall=false;
    int slippage=1000;
    //--------------------------------------------------------------------
    int init()
    {
    double AE = AccountEquity();
    EquityStart=AE+Profit_Percent;
    return(
    0);
    }
    //+------------------------------------------------------------------+
    int start()
    {
    if (!
    IsTradeAllowed()) return(0);

    double AB = AccountBalance();
    double AE = AccountEquity();

    DrawLABEL("Balance",1,5,20,Lime,StringConcatenate("Balance ",DoubleToStr(AB,2)));
    DrawLABEL("Equity" ,1,5,40,Lime,StringConcatenate("Equity ",DoubleToStr(AE,2)));

    if (
    OrdersTotal()==0) {Trall=false;EquityStart=AE+Profit_Percent;}
    if (!
    Trall)
    {
    DrawLABEL("Equity Start",1,5,60,Lime,StringConcatenate("Equity Start Trall ",DoubleToStr(MathMax(EquityStart,Total_Profit_Start),2)));
    if (
    AE>=EquityStart && AE>=Total_Profit_Start) //запуск тралла по эквити
    {
    EquityStart=AE+Profit_Percent;
    Alert("Запуск трейлинга Equity, Equity = "+DoubleToStr(AE,2));
    Trall=true;
    }
    }
    if (
    Trall)
    {
    if (
    EquityStart<AE+Profit_Percent) EquityStart=AE+Profit_Percent;
    DrawLABEL("Equity Start",1,5,0,Red,StringConcatenate("Трал Equity закрытие при ",DoubleToStr(EquityStart-EquityStart+Profit_Rollback,2)));
    if (
    AE<=EquityStart-EquityStart+AE+Profit_Rollback)
    {
    CloseAll();
    Trall=false;
    AE=AccountEquity();
    EquityStart=AE+Profit_Percent;
    }
    return(
    0);
    }
    return(
    0);
    }
    //------------------------------------------------------------------
    int deinit()
    {
    if (!
    IsTesting())
    {
    ObjectsDeleteAll(0);
    }
    return(
    0);
    }
    //-------------------------------------------------------------------
    void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
    {
    if (
    ObjectFind(name)!=-1) ObjectDelete(name);
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    ObjectSet(name, OBJPROP_CORNER, CORNER);
    ObjectSet(name, OBJPROP_XDISTANCE, X);
    ObjectSet(name, OBJPROP_YDISTANCE, Y);
    ObjectSetText(name,Name,10,"Arial",clr);
    }
    //+------------------------------------------------------------------+
    color Color(bool P,color a,color b)
    {
    if (
    P) return(a);
    else return(
    b);
    }
    //------------------------------------------------------------------
    double CloseAll()
    {
    bool error=true;
    int OMN,nn,OT,Ticket,j;
    double loss=0;
    while(
    true)
    {
    for (
    j = OrdersTotal()-1; j >= 0; j--)
    {
    if (
    OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    OMN=OrderMagicNumber();
    Ticket = OrderTicket();
    if (
    OT>1) error=OrderDelete(Ticket);
    if (
    OT==OP_BUY)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),slippage,Blue);
    if (
    error) loss+=OrderProfit();
    }
    if (
    OT==OP_SELL)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),slippage,Red);
    if (
    error) loss+=OrderProfit();
    }
    }
    }
    int n=0;
    for (
    j = 0; j < OrdersTotal(); j++)
    {
    if (
    OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    n++;
    }
    }
    if (
    n==0) break;
    nn++;
    if (
    nn>10)
    {
    Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",n);
    return(
    loss);
    }
    Sleep(1000);
    RefreshRates();
    }
    return(
    loss);
    }
    //--------------------------------------------------------------------


  16. post_thanks Получено лайков: 2

    VNS1 (06.05.2018), Незарегистрированный (1 пользователь)

  17. линк#11
    Свой человек
    Все пучком
     
    Дмитрий Александрович приемлемый уровень репутации Дмитрий Александрович приемлемый уровень репутации Аватар для Дмитрий Александрович
    Регистрация:
    08.09.2011
    Сообщений:
    594
    Накопленные выплаты (Подробнее):
    7412 RUB
    Поставил(а) лайков:
    261
    Получено лайков:   163
    в 96 сообщениях
    27%
    На догадках ещё изменил код, уже выполняет то что я хотел и выглядит неплохо:

    Название: зэ3.PNG
Просмотров: 271

Размер: 35.5 КБ


    Название: зэ4.PNG
Просмотров: 275

Размер: 72.5 КБ


    Название: зэ5.PNG
Просмотров: 270

Размер: 37.1 КБ


    Думаю,тут ещё есть что то лишние что можно убрать или сделать по другому.Буду ещё "ковырять",что нибудь слеплю
    вот код:
    PHP код:
    extern double Profit_Percent = 10; //% Шаг профита


    double EquityStart=0;
    bool Trall=false;
    int slippage=1000;
    //--------------------------------------------------------------------
    int init()
    {
    double AE = AccountEquity();
    EquityStart=AE+Profit_Percent;
    return(
    0);
    }
    //+------------------------------------------------------------------+
    int start()
    {
    if (!
    IsTradeAllowed()) return(0);

    double AB = AccountBalance();
    double AE = AccountEquity();

    DrawLABEL("Balance",1,5,20,Green,StringConcatenate("Баланс ",DoubleToStr(AB,2)));
    DrawLABEL("Equity" ,1,5,40,Green,StringConcatenate("Средства ",DoubleToStr(AE,2)));

    if (
    OrdersTotal()==0) {Trall=false;EquityStart=AE;}
    if (!
    Trall)
    {
    DrawLABEL("Equity Start",1,5,60,Lime,StringConcatenate("Закрытие при ",DoubleToStr((EquityStart),2)));
    if (
    AE>=EquityStart) //запуск тралла по эквити
    {

    Trall=true;
    }
    }
    if (
    Trall)
    {
    if (
    EquityStart<AE+Profit_Percent) EquityStart=AE+Profit_Percent;
    DrawLABEL("Equity Start",1,5,60,Red,StringConcatenate("ЗАКРЫТИЕ ОРДЕРОВ ",DoubleToStr(AccountEquity(),2)));
    if (
    AE<=EquityStart-EquityStart+AE)
    {
    CloseAll();
    Trall=false;
    AE=AccountEquity();
    EquityStart=AE+Profit_Percent;
    }
    return(
    0);
    }
    return(
    0);
    }
    //------------------------------------------------------------------
    int deinit()
    {
    if (!
    IsTesting())
    {
    ObjectsDeleteAll(0);
    }
    return(
    0);
    }
    //-------------------------------------------------------------------
    void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
    {
    if (
    ObjectFind(name)!=-1) ObjectDelete(name);
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    ObjectSet(name, OBJPROP_CORNER, CORNER);
    ObjectSet(name, OBJPROP_XDISTANCE, X);
    ObjectSet(name, OBJPROP_YDISTANCE, Y);
    ObjectSetText(name,Name,10,"Arial",clr);
    }
    //+------------------------------------------------------------------+
    color Color(bool P,color a,color b)
    {
    if (
    P) return(a);
    else return(
    b);
    }
    //------------------------------------------------------------------
    double CloseAll()
    {
    bool error=true;
    int OMN,nn,OT,Ticket,j;
    double loss=0;
    while(
    true)
    {
    for (
    j = OrdersTotal()-1; j >= 0; j--)
    {
    if (
    OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    OMN=OrderMagicNumber();
    Ticket = OrderTicket();
    if (
    OT>1) error=OrderDelete(Ticket);
    if (
    OT==OP_BUY)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),slippage,Blue);
    if (
    error) loss+=OrderProfit();
    }
    if (
    OT==OP_SELL)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),slippage,Red);
    if (
    error) loss+=OrderProfit();
    }
    }
    }
    int n=0;
    for (
    j = 0; j < OrdersTotal(); j++)
    {
    if (
    OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    n++;
    }
    }
    if (
    n==0) break;
    nn++;
    if (
    nn>10)
    {
    Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",n);
    return(
    loss);
    }
    Sleep(1000);
    RefreshRates();
    }
    return(
    loss);
    }
    //--------------------------------------------------------------------


  18. post_thanks Получено лайков: 1

    VNS1 (06.05.2018)

  19. линк#12
    Свой человек
    Все пучком
     
    Дмитрий Александрович приемлемый уровень репутации Дмитрий Александрович приемлемый уровень репутации Аватар для Дмитрий Александрович
    Регистрация:
    08.09.2011
    Сообщений:
    594
    Накопленные выплаты (Подробнее):
    7412 RUB
    Поставил(а) лайков:
    261
    Получено лайков:   163
    в 96 сообщениях
    27%
    Изменил что бы закрывались только открытые ордера.Отложенные ордера остаются.Мне так нужно...,может ещё кому.
    Взял этот код от скрипта на закрытие открытых ордеров
    PHP код:
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
    if (!
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
    if (
    OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
    if (
    OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);
    И "воткнул" его ,вот полностью код.Работает
    Не судите строго,я не программист,просто применяю метод интуитивного тыка
    PHP код:
    extern double Profit_Percent = 10; //% Шаг профита


    double EquityStart=0;
    bool Trall=false;
    int slippage=1000;
    //--------------------------------------------------------------------
    int init()
    {
    double AE = AccountEquity();
    EquityStart=AE+Profit_Percent;
    return(
    0);
    }
    //+------------------------------------------------------------------+
    int start()
    {
    if (!
    IsTradeAllowed()) return(0);

    double AB = AccountBalance();
    double AE = AccountEquity();

    DrawLABEL("Balance",1,5,20,Green,StringConcatenate("Баланс ",DoubleToStr(AB,2)));
    DrawLABEL("Equity" ,1,5,40,Green,StringConcatenate("Средства ",DoubleToStr(AE,2)));

    if (
    OrdersTotal()==0) {Trall=false;EquityStart=AE;}
    if (!
    Trall)
    {
    DrawLABEL("Equity Start",1,5,60,Lime,StringConcatenate("Закрытие при ",DoubleToStr((EquityStart),2)));
    if (
    AE>=EquityStart) //запуск тралла по эквити
    {

    Trall=true;
    }
    }
    if (
    Trall)
    {
    if (
    EquityStart<AE+Profit_Percent) EquityStart=AE+Profit_Percent;
    DrawLABEL("Equity Start",1,5,60,Red,StringConcatenate("ЗАКРЫТИЕ ОРДЕРОВ ",DoubleToStr(AccountEquity(),2)));
    if (
    AE<=EquityStart-EquityStart+AE)

    for (
    int i=OrdersTotal()-1; i>=0; i--)
    {
    if (!
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
    if (
    OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
    if (
    OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);
    Trall=false;
    AE=AccountEquity();
    EquityStart=AE+Profit_Percent;
    }
    return(
    0);
    }
    return(
    0);
    }
    //------------------------------------------------------------------
    int deinit()
    {
    if (!
    IsTesting())
    {
    ObjectsDeleteAll(0);
    }
    return(
    0);
    }
    //-------------------------------------------------------------------
    void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
    {
    if (
    ObjectFind(name)!=-1) ObjectDelete(name);
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    ObjectSet(name, OBJPROP_CORNER, CORNER);
    ObjectSet(name, OBJPROP_XDISTANCE, X);
    ObjectSet(name, OBJPROP_YDISTANCE, Y);
    ObjectSetText(name,Name,10,"Arial",clr);
    }
    //+------------------------------------------------------------------+
    color Color(bool P,color a,color b)
    {
    if (
    P) return(a);
    else return(
    b);
    }
    //------------------------------------------------------------------
    double CloseAll()
    {
    bool error=true;
    int OMN,nn,OT,Ticket,j;
    double loss=0;
    while(
    true)
    {
    for (
    j = OrdersTotal()-1; j >= 0; j--)
    {
    if (
    OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    OMN=OrderMagicNumber();
    Ticket = OrderTicket();
    if (
    OT>1) error=OrderDelete(Ticket);
    if (
    OT==OP_BUY)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),slippage,Blue);
    if (
    error) loss+=OrderProfit();
    }
    if (
    OT==OP_SELL)
    {
    error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),slippage,Red);
    if (
    error) loss+=OrderProfit();
    }
    }
    }
    int n=0;
    for (
    j = 0; j < OrdersTotal(); j++)
    {
    if (
    OrderSelect(j, SELECT_BY_POS))
    {
    OT = OrderType();
    n++;
    }
    }
    if (
    n==0) break;
    nn++;
    if (
    nn>10)
    {
    Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",n);
    return(
    loss);
    }
    Sleep(1000);
    RefreshRates();
    }
    return(
    loss);
    }
    //--------------------------------------------------------------------


  20. линк#13
    Свой человек
    Все пучком
     
    Дмитрий Александрович приемлемый уровень репутации Дмитрий Александрович приемлемый уровень репутации Аватар для Дмитрий Александрович
    Регистрация:
    08.09.2011
    Сообщений:
    594
    Накопленные выплаты (Подробнее):
    7412 RUB
    Поставил(а) лайков:
    261
    Получено лайков:   163
    в 96 сообщениях
    27%
    убрал не нужное,код меньше работает также
    PHP код:
    extern double Profit_Percent = 10; //% Шаг профита


    double EquityStart=0;
    bool Trall=false;
    int slippage=1000;
    //--------------------------------------------------------------------
    int init()
    {
    double AE = AccountEquity();
    EquityStart=AE+Profit_Percent;
    return(
    0);
    }
    //+------------------------------------------------------------------+
    int start()
    {
    if (!
    IsTradeAllowed()) return(0);

    double AB = AccountBalance();
    double AE = AccountEquity();

    DrawLABEL("Balance",1,5,20,Green,StringConcatenate("Баланс ",DoubleToStr(AB,2)));
    DrawLABEL("Equity" ,1,5,40,Green,StringConcatenate("Средства ",DoubleToStr(AE,2)));

    if (
    OrdersTotal()==0) {Trall=false;EquityStart=AE;}
    if (!
    Trall)
    {
    DrawLABEL("Equity Start",1,5,60,Lime,StringConcatenate("Закрытие при ",DoubleToStr((EquityStart),2)));
    if (
    AE>=EquityStart) //запуск тралла по эквити
    {

    Trall=true;
    }
    }
    if (
    Trall)
    {
    if (
    EquityStart<AE+Profit_Percent) EquityStart=AE+Profit_Percent;
    DrawLABEL("Equity Start",1,5,60,Red,StringConcatenate("ЗАКРЫТИЕ ОРДЕРОВ ",DoubleToStr(AccountEquity(),2)));
    if (
    AE<=EquityStart-EquityStart+AE)

    for (
    int i=OrdersTotal()-1; i>=0; i--)
    {
    if (!
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
    if (
    OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
    if (
    OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);
    Trall=false;
    AE=AccountEquity();
    EquityStart=AE+Profit_Percent;
    }
    return(
    0);
    }
    return(
    0);
    }
    //------------------------------------------------------------------
    int deinit()
    {
    if (!
    IsTesting())
    {
    ObjectsDeleteAll(0);
    }
    return(
    0);
    }
    //-------------------------------------------------------------------
    void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
    {
    if (
    ObjectFind(name)!=-1) ObjectDelete(name);
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    ObjectSet(name, OBJPROP_CORNER, CORNER);
    ObjectSet(name, OBJPROP_XDISTANCE, X);
    ObjectSet(name, OBJPROP_YDISTANCE, Y);
    ObjectSetText(name,Name,10,"Arial",clr);
    }
    //+------------------------------------------------------------------+
    color Color(bool P,color a,color b)
    {
    if (
    P) return(a);
    else return(
    b);
    }
    //------------------------------------------------------------------


  21. post_thanks Получено лайков: 2

    Phany (02.05.2018), Незарегистрированный (1 пользователь)

  22. линк#14
    Свой человек
    Все пучком
     
    Дмитрий Александрович приемлемый уровень репутации Дмитрий Александрович приемлемый уровень репутации Аватар для Дмитрий Александрович
    Регистрация:
    08.09.2011
    Сообщений:
    594
    Накопленные выплаты (Подробнее):
    7412 RUB
    Поставил(а) лайков:
    261
    Получено лайков:   163
    в 96 сообщениях
    27%
    Пожалуй всё,не буду больше ничего менять. Вот рабочий советник : CloseEquity_Shag.mq4
    вот код:
    PHP код:
    extern double Shag_Profita = 10; // Шаг профита


    double EquityStart=0;
    bool Trall=false;
    int slippage=1000;
    //--------------------------------------------------------------------
    int init()
    {
    double AE = AccountEquity();
    EquityStart=AE+Shag_Profita;
    return(
    0);
    }
    //+------------------------------------------------------------------+
    int start()
    {
    if (!
    IsTradeAllowed()) return(0);

    double AB = AccountBalance();
    double AE = AccountEquity();

    DrawLABEL("Balance",1,5,20,Green,StringConcatenate("Баланс ",DoubleToStr(AB,2)));
    DrawLABEL("Equity" ,1,5,40,Lime,StringConcatenate("Средства ",DoubleToStr(AE,2)));

    if (
    OrdersTotal()==0) {Trall=false;EquityStart=AE;}
    if (!
    Trall)
    {
    DrawLABEL("Equity Start",1,5,60,Lime,StringConcatenate("Закрытие при ",DoubleToStr((EquityStart),2)));
    if (
    AE>=EquityStart) //запуск тралла по эквити
    {

    Trall=true;
    }
    }
    if (
    Trall)
    {
    if (
    EquityStart<AE+Shag_Profita) EquityStart=AE+Shag_Profita;
    DrawLABEL("Equity Start",1,5,60,Red,StringConcatenate("ЗАКРЫТИЕ ОРДЕРОВ ",DoubleToStr(AccountEquity(),2)));
    if (
    AE<=EquityStart-EquityStart+AE)

    for (
    int i=OrdersTotal()-1; i>=0; i--)
    {
    if (!
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
    if (
    OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);
    if (
    OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);
    Trall=false;
    AE=AccountEquity();
    EquityStart=AE+Shag_Profita;
    }
    return(
    0);
    }
    return(
    0);
    }

    void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
    {
    if (
    ObjectFind(name)!=-1) ObjectDelete(name);
    ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
    ObjectSet(name, OBJPROP_CORNER, CORNER);
    ObjectSet(name, OBJPROP_XDISTANCE, X);
    ObjectSet(name, OBJPROP_YDISTANCE, Y);
    ObjectSetText(name,Name,15,"Arial",clr);
    }
    //+------------------------------------------------------------------+
    color Color(bool P,color a,color b)
    {
    if (
    P) return(a);
    else return(
    b);
    }
    //------------------------------------------------------------------
    Думаю можно ещё подправить.Если кто нибудь знает ,то пожалуйста.


  23. post_thanks Получено лайков: 2

    Grinluks (03.01.2020), Незарегистрированный (1 пользователь)

  24. линк#15
    Свой человек
    Все пучком
     
    Дмитрий Александрович приемлемый уровень репутации Дмитрий Александрович приемлемый уровень репутации Аватар для Дмитрий Александрович
    Регистрация:
    08.09.2011
    Сообщений:
    594
    Накопленные выплаты (Подробнее):
    7412 RUB
    Поставил(а) лайков:
    261
    Получено лайков:   163
    в 96 сообщениях
    27%
    Заметил что если нет отложенных ордеров,то закрывает ордера сразу после открытия.Нужно исправить.


  25. post_thanks Получено лайков: 3

    dgefff (08.05.2018), Grinluks (03.01.2020), Незарегистрированный (1 пользователь)

    <a href="https://www.instaforex.com/ru/forexcopy_system">Форекс портал</a>
  26. линк#16
    Частый гость
    Валерий Бадаев приемлемый уровень репутации Аватар для Валерий Бадаев
    Регистрация:
    22.06.2018
    Пол:
    Мужчина
    Сообщений:
    208
    Накопленные выплаты (Подробнее):
    0 RUB
    Поставил лайков:
    62
    Получено лайков:   67
    в 60 сообщениях
    32%
    Цитата Сообщение от Дмитрий Александрович Посмотреть сообщение
    Заметил что если нет отложенных ордеров,то закрывает ордера сразу после открытия.Нужно исправить.
    Добрый день!Подскажите пожалуйста, версия советника в предыдущем посте окончательная?


  27. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)


Подписанные на тему (1)

Открыть

Похожие темы

  1. Установка и закрытие ордеров с помощью линий
    от cmillion в разделе Автоматизированные торговые системы
    Replies: 255
    Последнее сообщение: 01.07.2020, 05:38
  2. Replies: 6
    Последнее сообщение: 21.05.2017, 17:09
  3. MQL5: Закрытие всех позиций когда "эквити" достигает баланса
    от Джабраил Бачаев в разделе MQL-программирование, АТС
    Replies: 1
    Последнее сообщение: 16.04.2017, 17:40
  4. Как реализовать закрытие и удаление трех ордеров при закрытии одного из них по тп?
    от Иван Константинович в разделе MQL-программирование, АТС
    Replies: 1
    Последнее сообщение: 04.07.2012, 15:31
  5. Replies: 6
    Последнее сообщение: 12.09.2011, 17:31