Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 898

 
ponochka:
Здраствуйте! Помогите сделать следующее:
Надо сделать целевую прибыль для каждой открытой позиции в рынке, но не общую, а отдельную!
пример: открылся EURUSD и у него в настройках стоит целевая прибыль 1$ и как только она достигла ее, то позиция сама закрылась, только она!
и так каждая валютная пара должна работать сама по себе, а не по общему профиту!

Код общего профита по всем парам я нашла:
помогите переделать для каждой валютной пары отдельно......Заранее благодарна!

Если покопаться, можно и это найти.

//+----------------------------------------------------------------------------+
//|                                          e-CloseByProfitPosInCurrency.mq4  |
//|                                                                            |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//|  22.04.2008  Советник закрывает только те позиции, у которых профит        |
//|              в валюте депозита превысил некоторое заданное значение.       |
//+----------------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"


//------- Внешние параметры советника -----------------------------------------+
string _P_Expert = "---------- Параметры советника";
extern int    NumberAccount = 0;       // Номер торгового счёта
extern string symbol        = "";      // Торговый инструмент
                                       //   ""  - любой
                                       //   "0" - текущий
extern int    Operation     = -1;      // Торговая операция:
                                       //   -1 - любая
                                       //    0 - OP_BUY
                                       //    1 - OP_SELL
extern double Profit        = 50;      // Профит в валюте депозита
extern int    MagicNumber   = 0;       // MagicNumber
extern bool   ShowComment   = True;    // Показывать комментарий


//------- Глобальные переменные советника -------------------------------------+
bool   gbNoInit      = False;          // Флаг неудачной инициализации
int    Slippage      = 3;              // Проскальзывание цены
int    NumberOfTry   = 5;              // Количество торговых попыток
bool   UseSound      = True;           // Использовать звуковой сигнал
string NameFileSound = "expert.wav";   // Наименование звукового файла
color  clCloseBuy    = Blue;           // Цвет значка закрытия покупки
color  clCloseSell   = Red;            // Цвет значка закрытия продажи

//------- Подключение внешних модулей -----------------------------------------+
#include <stdlib.mqh>             // Стандартная библиотека


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
void init() {
  gbNoInit = False;
  if (!IsTradeAllowed()) {
    Message("Для нормальной работы советника необходимо\n"+
            "Разрешить советнику торговать");
    gbNoInit=True; return;
  }
  if (!IsLibrariesAllowed()) {
    Message("Для нормальной работы советника необходимо\n"+
            "Разрешить импорт из внешних экспертов");
    gbNoInit=True; return;
  }
  if (Operation<-1 || Operation>1) {
    Message("Недопустимое значение внешнего параметра Operation");
    gbNoInit=True; return;
  }
  if (symbol!="0" && symbol!="") {
    if (MarketInfo(StringUpper(symbol), MODE_BID)==0) {
      Message("В обзоре рынка отсутствует символ "+symbol);
      gbNoInit=True; return;
    }
  }
  if (!IsTesting()) {
    if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком");
    else Message("Отжата кнопка \"Разрешить запуск советников\"");
  }
}

//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comment(""); }

//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() {
  if (gbNoInit) {
    Comment("Не удалось инициализировать советник!"); return;
  }
  if (!IsTesting()) {
    if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
      Comment("Работа на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!");
      return;
    } else Comment("");
    if (ShowComment) {
      string st="NumberAccount="+DoubleToStr(NumberAccount, 0)
               +"  Symbol="+IIFs(symbol=="0", "All", IIFs(symbol=="", Symbol(), StringUpper(symbol)))
               +"  Operation="+IIFs(Operation<0, "All", GetNameOP(Operation))
               +"  Profit="+DoubleToStr(Profit, 2)+" "+AccountCurrency()
               +"  MagicNumber="+DoubleToStr(MagicNumber, 0)
               +IIFs(ShowComment, "  ShowComment", "")
               ;
      Comment(st);
    } else Comment("");
  }

  ClosePosBySizeProfitInCurrency(StringUpper(symbol), Operation, MagicNumber, Profit);
}


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
              ErrorDescription(err),", try ",it);
        Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
        Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
              "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}

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

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>pr) ClosePosBySelect();
          }
        }
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование торговой операции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("Buy Limit");
    case OP_SELLLIMIT: return("Sell Limit");
    case OP_BUYSTOP  : return("Buy Stop");
    case OP_SELLSTOP : return("Sell Stop");
    default          : return("Unknown Operation");
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Вывод сообщения в коммент и в журнал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - текст сообщения                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в ВЕРХНЕМ регистре                           |
//+----------------------------------------------------------------------------+
string StringUpper(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>96 && c<123) n=c-32;    // a-z -> A-Z
    if (c>223 && c<256) n=c-32;   // а-я -> А-Я
    if (c==184) n=168;            //  ё  ->  Ё
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}
//+----------------------------------------------------------------------------+

 
Здравствуйте. Кто-нибудь, объясните неучу, почему функция 

double  iOpen(
   string           symbol,          // символ
   int              timeframe,       // период
   int              shift            // сдвиг
   );

если я вставляю символьное имя инструмента, как сказано в справочнике,(а не 0 и не NULL) и запускаю в тестере на график, мне выдается ответ 0.0? При этом 0 и NULL выдают правильные значения.  Спасибо.

 
novichok2018:
Здравствуйте. Кто-нибудь, объясните неучу, почему функция 

double  iOpen(
   string           symbol,          // символ
   int              timeframe,       // период
   int              shift            // сдвиг
   );

если я вставляю символьное имя инструмента, как сказано в справочнике,(а не 0 и не NULL) и запускаю в тестере на график, мне выдается ответ 0.0? При этом 0 и NULL выдают правильные значения.  Спасибо.

Ой, извините, невнимателен: просто в имени инструмента пропустил одну буковку. Все нормально - неуч есть неуч.

 
novichok2018:

Ой, извините, невнимателен: просто в имени инструмента пропустил одну буковку. Все нормально - неуч есть неуч.

А теперь возник другой вопрос: почему double DJop1 = iOpen("DowJones30",PERIOD_H1,1), запущенная на другом инструменте (не DowJones30) выдает правильные значения, а double DJbid = MarketInfo("DowJones30",MODE_BID) выдает 0.0, хотя на DowJones30 работает нормально?

 
Alekseu Fedotov:

Спасибо, что то непонятно, сейчас позиция в плюсе, но пишет 0.25.

void OnTick()
  {
//---
   double drawdown=AccountProfit()*100/AccountBalance();
   Comment("текущая просадка  = ",drawdown);
  }
Файлы:
htygj.jpg  421 kb
 
nalyk:

Спасибо, что то непонятно, сейчас позиция в плюсе, но пишет 0.25.

Так ведь правильно, посчитайте .

 

Кто может помочь с этим вопросом https://www.mql5.com/ru/forum/160683/page897#comment_12221175?

 
Seric29:

Кто может помочь с этим вопросом https://www.mql5.com/ru/forum/160683/page897#comment_12221175?

#property strict

template<typename T>struct A
  {
   T                 val;
   int               ind;
  };
  A<double> MyStructDouble;
  
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   MyStructDouble.val = 123.456;
   MyStructDouble.ind = 123;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  Print("MyStructDouble.val = ",MyStructDouble.val," , MyStructDouble.ind = ",MyStructDouble.ind);
  }
//+------------------------------------------------------------------+ 

2019.06.27 14:20:36.265 test EURUSD,H1: MyStructDouble.val = 123.456 , MyStructDouble.ind = 123

2019.06.27 14:20:35.700 test EURUSD,H1: MyStructDouble.val = 123.456 , MyStructDouble.ind = 123

2019.06.27 14:20:35.427 test EURUSD,H1: MyStructDouble.val = 123.456 , MyStructDouble.ind = 123

2019.06.27 14:20:34.758 test EURUSD,H1: initialized

 
Igor Makanu:

т.е. несмотря на применение шаблона всё равно нужно присвоить тип

A<double> MyStructDouble;

А с классами как будет выглядеть такой код, применить шаблон к классу.

 
Seric29:

т.е. несмотря на применение шаблона всё равно нужно присвоить тип

А с классами как будет выглядеть такой код, применить шаблон к классу.

С++ взят за основу в MQL, все Си подобные языки строго типизированные - гугл в помощь

один  в один как мой пример, замените struct на class

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