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);
}
//+----------------------------------------------------------------------------+

 
안녕하세요. 누군가가 무지한 사람에게 왜 기능을 설명하는지 설명합니다.

이중 iOpen (
                기호 , // 기호
    정수                timeframe , // 기간
    정수                옮기다             // 옮기다
);

가이드에 나와 있는 대로 악기의 상징적인 이름을 삽입하고(0도 아니고 NULL도 아님) 차트 테스터에서 실행하면 답이 0.0이 될까요? 이 경우 0과 NULL은 올바른 값을 생성합니다. 고맙습니다.

 
novichok2018 :
안녕하세요. 누군가가 무지한 사람에게 왜 기능을 설명하는지 설명합니다.

이중 iOpen (
                기호 , // 기호
    정수                timeframe , // 기간
    정수                옮기다             // 옮기다
);

가이드에 나와 있는 대로 악기의 상징적인 이름을 삽입하고(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 EURUSD,H1 테스트: MyStructDouble.val = 123.456, MyStructDouble.ind = 123

2019.06.27 14:20:35.700 EURUSD,H1 테스트: MyStructDouble.val = 123.456, MyStructDouble.ind = 123

2019.06.27 14:20:35.427 EURUSD,H1 테스트: MyStructDouble.val = 123.456, MyStructDouble.ind = 123

2019.06.27 14:20:34.758 테스트 EURUSD,H1: 초기화됨

 
Igor Makanu :

저것들. 템플릿 사용 에도 불구하고 여전히 유형을 할당해야 합니다.

A< double > MyStructDouble;

그리고 클래스의 경우 이러한 코드가 어떻게 생겼는지 템플릿을 클래스에 적용합니다.

 
Seric29 :

저것들. 템플릿 사용 에도 불구하고 여전히 유형을 할당해야 합니다.

그리고 클래스의 경우 이러한 코드가 어떻게 생겼는지 템플릿을 클래스에 적용합니다.

C++는 MQL의 기본으로 사용되며 모든 C 유사 언어는 강력한 형식으로 지정됩니다. - Google에서 구출

내 예와 같이 일대일로 구조체를 클래스로 바꿉니다.