[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 491

 

Помогите пожалуйста, сделать вот эту функцию наоборот:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Перенос уровня стопа в безубыток                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//|    Кроме того, функция MovingInWL() предполагает наличие глобальных переменных (внешних параметров скрипта или советника):
//|    int LevelProfit - Уровень профита в пунктах, которого должна достигнуть позиция для того, чтобы её стоп был перенесён на уровень безубытка.
//|    int LevelWLoss - Уровень безубытка в пунктах, на который будет перенесён стоп позиции после того, как её профит достигнет уровня LevelProfit в пунктах.
//+----------------------------------------------------------------------------+
void MovingInWL(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      po=MarketInfo(OrderSymbol(), MODE_POINT);
      if (OrderType()==OP_BUY) {
        if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_BID);
          if (pp-OrderOpenPrice()>LevelProfit*po) {
            ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
          }
        }
      }
      if (OrderType()==OP_SELL) {
        if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
          pp=MarketInfo(OrderSymbol(), MODE_ASK);
          if (OrderOpenPrice()-pp>LevelProfit*po) {
            ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
          }
        }
      }
    }
  }
}

то есть если цена уходит в убыток от открытого ордера на количество пунктов LevelProfit (можно назвать LevelLoss), нужно переностить тейкпрофит в ноль или в убыток на 1 пункт 2 и т.д., смотря что поставить в параметре LevelWLoss, чтобы если цена и развернется, профита бы уже не было. Или может у кого готовая есть?

Заранее благодарю))

 

Доброго дня! Вы знаете, только что вырезал код из раздела инит советника, ( я так отлаживал на выходные - тиков то нет!), перенёс в старт. Убрал наружный цикл фор. Компилировал.

Заругалось--  'continue' - 'break' or 'continue' used within some cycle only C:\Альпари\experts\Выходные.mq4 (69, 20)

О чём это оно? Ну в цикле континуэ, в цикле, и что? Я вот английский не очень..  Если некие слова и пойму, то до кучи смысла не сложу!

 if (strela1 < strela2)
    {Sleep(600);
        if (SELL > 0) udalenie (OP_SELL);Sleep(600);
        if (BUY == 0)
        {Sleep(600);RefreshRates();
           OrderSend (Symbol( ), OP_SELL, lot, NormalizeDouble (Bid, Digits), 5 , NormalizeDouble( Ask+ (stoplos*Point),Digits),   NormalizeDouble( Ask-( takeprofit*Point),Digits), NULL, magicnumber, 0, CLR_NONE) ;            
           int Error=GetLastError(); 
           Sleep(600);
    if (Error==129)continue;    }
    
    
    }
    else if (strela1 > strela2)
    {Sleep(600);
        if (BUY > 0) udalenie (OP_BUY);Sleep(600);
        if (SELL == 0)
        {Sleep(600); RefreshRates();
             OrderSend (Symbol( ), OP_BUY, lot,NormalizeDouble(Ask, Digits), 5, NormalizeDouble( Bid- (stoplos*Point),Digits),   NormalizeDouble( Ask+( takeprofit*Point),Digits), NULL, magicnumber, 0, CLR_NONE); 
            
           Error=GetLastError(); 
        if (Error==129)continue;  }
 
Dimka-novitsek:

Доброго дня! Вы знаете, только что вырезал код из раздела инит советника, ( я так отлаживал на выходные - тиков то нет!), перенёс в старт. Убрал наружный цикл фор. Компилировал.

Заругалось--  'continue' - 'break' or 'continue' used within some cycle only C:\Альпари\experts\Выходные.mq4 (69, 20)

О чём это оно? Ну в цикле континуэ, в цикле, и что? Я вот английский не очень..  Если некие слова и пойму, то до кучи смысла не сложу!

 

у тебя цикла нет, а оператор continue стоит(он используется только в циклах).
 
Lians:

Помогите пожалуйста, сделать вот эту функцию наоборот:

то есть если цена уходит в убыток от открытого ордера на количество пунктов LevelProfit (можно назвать LevelLoss), нужно переностить тейкпрофит в ноль или в убыток на 1 пункт 2 и т.д., смотря что поставить в параметре LevelWLoss, чтобы если цена и развернется, профита бы уже не было. Или может у кого готовая есть?

Заранее благодарю))

Функция может быть такой: 

void fMoving_TPInBU (int fi_LevelLOSS,       // уровень Лосса в пп. (для цены) - ТОЛЬКО > 0
                     int fi_LevelBU,         // уровень БУ в пп. (для тэйкпрофита) - может быть и >= 0 и < 0
                     string fs_Symbol = "",  // Symbol
                     int fi_Type = -1,       // Type
                     int gi_MG = -1)         // MagicNumber
{
    double ld_Point, ld_Price;
    int    li_Type, li_cnt, li_total = OrdersTotal();
//----
    if (li_total == 0) return;
    if (fs_Symbol == "" || fs_Symbol == "0") fs_Symbol = Symbol();
    for (int li_pos = li_total - 1; li_pos >= 0; li_pos--)
    {
        if (!OrderSelect (li_pos, SELECT_BY_POS, MODE_TRADES)) continue;
        if (OrderSymbol() != fs_Symbol) continue;
        if (gi_MG > -1) if (gi_MG != OrderMagicNumber()) continue;
        li_Type = OrderType();
        if (li_Type > 1) continue;
        if (li_Type > -1) if (li_Type != fi_Type) continue;
        RefreshRates();
        if (li_Type == 0) {li_cnt = 1; ld_Price = MarketInfo (fs_Symbol, MODE_BID);}
        else {li_cnt = -1; ld_Price = MarketInfo (fs_Symbol, MODE_ASK);}
        ld_Point = MarketInfo (OrderSymbol(), MODE_POINT);
        if (li_cnt * (OrderOpenPrice() - ld_Price) >= fi_LevelLOSS * ld_Point)
        {
            double ld_TP = NormalizeDouble (OrderOpenPrice() + li_cnt * fi_LevelBU * ld_Point, MarketInfo (fs_Symbol, MODE_DIGITS));
            //---- Проверка на "излишнюю" модификацию
            if (ld_TP - OrderTakeProfit() != 0.0)
            {OrderModify (OrderTicket(), ld_Price, OrderStopLoss(), ld_TP, 0);}
        }
    }
//----
}

 Не нужно забывать при модификации СТОПов проверять на ограничения MODE_STOPLEVEL и MODE_FREEZELEVEL.

 

Спасибо!! Щас гляну..

Как нет? А   if (BUY == 0)- разве это не цикл? Страно, я убрал только самый наружный цикл, который было обьял скобками всю программу что в старте. Он было нужен был для отладки , и я его убрал.

Вот, а если не туда, то пусть if (strela1 < strela2) передаёт, логиа работы программы не нарушится. 

 
Dimka-novitsek:

Спасибо!! Щас гляну..

Как нет? А   if (BUY == 0)- разве это не цикл? Страно, я убрал только самый наружный цикл, который было обьял скобками всю программу что в старте. 


Нет. Не цикл. Ты убрал, как раз то, что нужно было оставить. Читай весь учебник!  Особенно здесь: " Пример использования составного оператора в условном операторе. Сначала идет условный оператор if(выражение), за ним следует составной оператор. Составной оператор содержит список исполняемых операторов."

 
Читаю.
 
HELP!Прошу помощи !!В качестве примера прилагаю данный рисунок. Я не программист данный индикатор кое-как спаял но дальше все уткнулся в нехватку знаний и умений пытался целую неделю вывести стрелки на экран -ничего не получилось.Объясню суть.На выделенных местах-подчеркнуто белым,наблюдается явная дивергенция (как я ее понимаю) то есть расхождения показателей гистограммы и линии с ценой.На рисунке для примера я отметил эти места цифрами 1-2-3-4.В этих местах значения линии индикатора уменьшаются по модулю, хотя цена продолжает обновлять низы и таким образом мы добрались до точки 5 в ней мы видим основу цена обновила лоу и низ по закрытию ,  гистограмма тоже растет, но линия показывает уменьшение .Вот эта точка нам и нужна.Если кого-то заинтересовало среди программеров-помогите.Хотя бы для начала стрелки начертить.
Файлы:
tjllfe2.zip  45 kb
 

TarasBY, спасибо за пояснения и функцию!

Функцию за бираю к себе в коллекцию, но кое-что непонятно:

Параметр fi_LevelBU если с минусом - это сдвиг тейка в убыток, а если с плюсом в прибыль или наоборот?

И второй: проверку на ограничения лучше в самой функции проводить или сделать это вне функции?

 
Lians:

TarasBY, спасибо за пояснения и функцию!

Функцию за бираю к себе в коллекцию, но кое-что непонятно:

Параметр fi_LevelBU если с минусом - это сдвиг тейка в убыток, а если с плюсом в прибыль или наоборот?

Правильно (не наоборот). 

Lians:

И второй: проверку на ограничения лучше в самой функции проводить или сделать это вне функции?

Это каждый решает для себя сам. Я сделал себе библиотеку,  которая отвечает за исполнение торговых приказов и контролирует проверку на все ограничения.

P.S. В коде функции была небольшая ошибка (лишняя скобка) - подправил.

Причина обращения: