MQL5 언어를 처음부터 자가 학습 - 페이지 84

 
Georgiy Merts # :

Duc와 나는 그것에 대해 이야기하고 있습니다!

그리고 당신은 "아무도 본 사람이 없습니다"라고 말합니다. 아무도 관심이 없습니다-아무도 본 적이 없습니다(광대는 관심이 없습니다-본 적이 없습니다). 관심있는 사람들 - 그들은 보았습니다.

광대에 대해 중재자에게 불만을 보냈습니다. 당신이 금지 될 때까지 이것을 할 것입니다.
 
Vladimir Baskakov # :
광대에 대해 중재자에게 불만을 보냈습니다. 당신이 금지 될 때까지 이것을 할 것입니다.

아, 맨 엉덩이로 고슴도치를 겁먹게 했어...

 
Georgiy Merts # :

아, 맨엉덩이로 고슴도치를 겁먹게 했어...

서두르지 않아
 
Georgiy Merts # :

그리고 문제가 보이지 않습니다.

글쎄, 맞아. 채워진 배열이 선언되고 다른 데이터로 다시 채워집니다. 제 생각에는 완전히 받아들일 수 있는 초보자의 실수입니다.

그리고 실수인가요?

변수와 배열을 선언할 때 저는 항상 즉시 채웁니다. 발표 당시 정확한 값을 알 수 없는 경우 고의적으로 잘못된 값으로 채웁니다. 초기화되지 않은 변수를 사용하는 오류를 가장 효과적으로 식별하기 위해. 초기화 없이 변수를 선언한 후 사용하게 되면 연산 중에 사용될 임의의 값이 포함될 수 있고, 이 작업의 결과가 틀리게 되어 문제를 찾기가 매우 어려울 것입니다. 이것에 한 번 이상).

그러나 변수가 생성 시 유효하지 않은 값으로 즉시 초기화되면 초기화되지 않은 변수가 사용되면 일종의 쓰레기가 포함되어 있음이 즉시 분명해지며 해당 변수의 출처를 쉽게 찾고 변수가 초기화 없이 사용됩니다.

그래서 개인적으로 이미 채워진 배열을 선언하는 것이 올바른 방법이라고 생각합니다. WRONG_VALUE를 취해야 하는 값일 뿐입니다.

저는 변수와 배열의 초기화에 대해 전혀 반대하지 않습니다. 예를 들어 다음과 같이

 int ExtHandle[ 21 ] = {};

또한 초기화된 배열이 됩니다. 그러나 OnInit()에서 전체 배열이 채워지기 때문에 이 특별한 경우에는 이것이 필요하지 않습니다. 그래서 저는 필요가 없다고 봅니다. 그리고 사과를 들고 있는 피노키오조차도 여기에서 굴러가지 않습니다. 왜냐하면 값을 사용(읽기)하기 전에 이미 초기화되어 있기 때문입니다.

 
Alexey Viktorov # :

나는 변수와 배열의 초기화에 대해 전혀 반대하지 않습니다. 예를 들어 다음과 같이

또한 초기화된 배열이 됩니다. 그러나 OnInit()에서 전체 배열이 채워지기 때문에 이 특별한 경우에는 이것이 필요하지 않습니다. 그래서 저는 필요가 없다고 봅니다. 그리고 사과를 들고 있는 피노키오조차도 여기에서 굴러가지 않습니다. 왜냐하면 값을 사용(읽기)하기 전에 이미 초기화되어 있기 때문입니다.

에에... 그리고 어디에서 "초기화"됩니까? 코드에 따르면 이러한 배열은 쓰레기로 채워질 것입니다.

제 생각에는 다음과 같이 유효하지 않은 값으로 생성 시 초기화하는 것이 좋습니다.

 int ExtHandle[ 3 ] = { WRONG_VALUE ; WRONG_VALUE ; WRONG_VALUE };

물론 배열이 크다면 이 방법으로 채우는 것은 무리다. 이 경우에는 큰 배열이라도 유효하지 않은 값으로 채우는 DEBUG 버전을 사용하지만, RELEASE 버전은 채우지 않는다.

이 연습은 초기화되지 않은 변수를 사용하지 않도록 반복적으로 구해주었습니다.

 
SanAlex # :

코드에 있는 당신의 이름 - 당신이 게시한 코드, 나는 당신의 이름으로 만들었습니다. 하지만 그는 일하지 않았다.


글쎄, 당신의 비뚤어진 손에 대한 책임은 누구에게 있습니까?

사진은 계산된 값이 9.08253 이고 변환 후 9.08 이라고 나와있고 소수점 16자리는 알려주지 마세요.

그리고 한 가지 더, 값이 최소 볼륨보다 작으면

보여주기 위해 다른 변수를 도입해야했습니다 ...

 
Georgiy Merts # :

에에... 그리고 어디에서 "초기화"됩니까? 코드에 따르면 이러한 배열은 쓰레기로 채워질 것입니다.

제 생각에는 다음과 같이 유효하지 않은 값으로 생성 시 초기화하는 것이 좋습니다.

물론 배열이 크다면 이 방법으로 채우는 것은 무리가 있습니다. 이 경우에는 큰 배열도 유효하지 않은 값으로 채우는 DEBUG 버전을 사용하지만 RELEASE 버전은 채우지 않습니다.

이 연습은 초기화되지 않은 변수를 사용하지 않도록 반복적으로 구해주었습니다.

여기, 전용 루프에서. 그리고 제가 하나의 어레이에 대해서만 이야기하고 있다는 사실에 주목하십시오.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MQL5 언어를 처음부터 자가 학습

산알렉스 , 2021.11.29 07:17

무슨 말인지 이해가 안 돼요? 내 손으로 직접 만든건데 무슨 소리야? 터미널의 코드는 아니지만 방법 자체, 여러 쌍에 대한 테스터에서 오프닝을 구현하는 방법, 나는 개인적으로 결과를 달성했습니다.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

내가 당신에게서 코드를 받은 곳을 보여주세요?

 //+------------------------------------------------------------------+

//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link        " https://www.mql5.com "
#property version    "1.00"
//---
#include <Trade\Trade.mqh>
//---
CTrade ExtTrade;
//+------------------------------------------------------------------+
input double MaximumRisk        = 0.02 ; // Maximum Risk in percentage
//---
int     ExtHandle[]= { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 };
double LotsRisk[] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 };
string symb_name[]= { "EURUSD" , "GBPUSD" , "USDCHF" , "USDJPY" , "USDCAD" , "AUDUSD" , "AUDNZD" ,
                     "AUDCAD" , "AUDCHF" , "AUDJPY" , "CHFJPY" , "EURGBP" , "EURAUD" , "EURCHF" ,
                     "EURJPY" , "EURNZD" , "EURCAD" , "GBPCHF" , "GBPJPY" , "CADCHF" , "GBPAUD"
                    };

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   ExtTrade.SetExpertMagicNumber( 0 );
   ExtTrade.SetMarginMode();
//---
   for ( int i= 0 ; i< 20 ; i++)
     {
      ExtTrade.SetTypeFillingBySymbol(symb_name[i]);
       //--- Moving Average indicator
      ExtHandle[i]= iMA (symb_name[i], _Period , 12 , 6 , MODE_SMA , PRICE_CLOSE );
       if (ExtHandle[i]== INVALID_HANDLE )
        {
         printf ( "Error creating MA indicator" );
         return ( INIT_FAILED );
        }
     }
//---
   return ( INIT_SUCCEEDED );
  }


코드에서 우리의 대화와 관련이 없는 모든 것을 제거했습니다. 글쎄, 거의 모든 ...

 
Alexey Viktorov # :

여기, 전용 루프에서. 그리고 제가 하나의 어레이에 대해서만 이야기하고 있다는 사실에 주목하십시오.

네 맞습니다. 제 생각에는 정상적인 관행입니다.

 
SanAlex # :

이것은 거의 준비되었습니다. 작동하지 않는 추가 기능을 제거하기만 하면 됩니다. 이 "MACD Sample.mq5"에서 이 다중 통화 전문가 고문을 삽질했습니다.

마치 작동할 수 있도록 불필요한 모든 것을 제거한 것처럼. 여전히 염두에두고 여기에 배치해야합니다.

스크린샷 2021-11-29 155519

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\

여기 내가 지금까지 한 일이 있습니다. 다른 사람이 더 잘할 수 있습니다.

파일:
00001_Mult.mq5  15 kb
 
Alexey Viktorov # :

이거 안썼으면 진짜...

다음은 작업 기능입니다.

전체 무료 마진에서 계산하지 않으려면 위험 금액을 입력하는 것만으로 충분합니다 ...

좋은 하루와 좋은 분위기 모두!

아주 오랫동안 배열을 이해하고 연구했지만 결과는 이미 거기에 있습니다. 12개의 통화 쌍에 대한 위험을 계산하는 함수의 코드를 독립적으로 작성했습니다.

안부 인사를 전합니다. 블라디미르.

 //+------------------------------------------------------------------+
//| Входные параметры советника                                      |
//+------------------------------------------------------------------+

input double    Risk0= 1.0 ;           //Риск для валютной пары EURUSD (% от баланса)
.
.
.
.
input double    Risk11= 1.0 ;           //Риск для валютной пары EURJPY (% от баланса)

//+------------------------------------------------------------------+
//| Функция Money_Management рассчитывает размер лота в зависимости  |
//| от риска, заданного во входных параметрах советника.             |
//+------------------------------------------------------------------+
double Money_Management()
  {
//--- объявляем динамический массив
   double risk[];
//--- устанавливаем размер массива
   ArrayResize (risk, 12 );
//--- заполняем массив значениями риска
   ArrayFill (risk, 0 , 1 ,Risk0);
   ArrayFill (risk, 1 , 1 ,Risk1);
   ArrayFill (risk, 2 , 1 ,Risk2);
   ArrayFill (risk, 3 , 1 ,Risk3);
   ArrayFill (risk, 4 , 1 ,Risk4);
   ArrayFill (risk, 5 , 1 ,Risk5);
   ArrayFill (risk, 6 , 1 ,Risk6);
   ArrayFill (risk, 7 , 1 ,Risk7);
   ArrayFill (risk, 8 , 1 ,Risk8);
   ArrayFill (risk, 9 , 1 ,Risk9);
   ArrayFill (risk, 10 , 1 ,Risk10);
   ArrayFill (risk, 11 , 1 ,Risk11);
//---
   double price= 0.0 ;
   double margin= 0.0 ;
   double MaximumRisk=risk[ 11 ]/ 100 ;
//---
   if (! SymbolInfoDouble ( _Symbol , SYMBOL_ASK ,price))
       return ( 0.0 );
   if (! OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 1.0 ,price,margin))
       return ( 0.0 );
   if (margin<= 0.0 )
       return ( 0.0 );
//---
   double min_volume= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
   double max_volume= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
//---
   double lot= NormalizeDouble ( AccountInfoDouble ( ACCOUNT_MARGIN_FREE )*MaximumRisk/margin, 2 );
//---
   if (lot<min_volume)
      lot=min_volume;
   if (lot>max_volume)
      lot=max_volume;
   return (lot);
  }
//+------------------------------------------------------------------+