MQL5 dilini sıfırdan kendi kendine öğrenme - sayfa 84

 
Georgiy Merts # :

Duc ve ben bundan bahsediyoruz!

Bir de "kimse görmedi" diyorsunuz. Kimse ilgilenmiyor - kimse görmedi (palyaçolar ilgilenmez - görmediler). İlgilenenler - gördüler.

Palyaço hakkında moderatörlere şikayet gönderdim, siz banlanana kadar bunu yapacağım.
 
Vladimir Baskakov # :
Palyaço hakkında moderatörlere şikayet gönderdim, siz banlanana kadar bunu yapacağım.

Oh, kirpiyi çıplak kıçıyla korkuttu...

 
Georgiy Merts # :

Oh, kirpiyi çıplak kıçıyla korkuttu...

acele etmem
 
Georgiy Merts # :

Ve bir sorun görmüyorum.

Pekala, doğru. Doldurulmuş bir dizi bildirilir ve ardından tekrar diğer verilerle doldurulur. Bence, tamamen kabul edilebilir bir başlangıç hatası.

Ve bu bir hata mı?

Değişkenleri ve dizileri bildirirken, DAİMA onları DERHAL doldururum. Duyuru sırasında kesin değer bilinmiyorsa, kasıtlı olarak geçersiz bir değerle doldururum. Başlatılmamış bir değişken kullanma hatasını en etkili şekilde belirlemek için. Başlatmadan bir değişken bildirirseniz ve sonra kullanırsanız, işlem sırasında kullanılacak rastgele değerler içerebilir ve bu çalışmanın sonucu yanlış olur, sorunu bulmak çok zor olacaktır ( buna bir kereden fazla rastlamak).

Ancak, oluşturulduğunda değişken hemen geçersiz bir değerle başlatılırsa, başlatılmamış bir değişken kullanılırsa, bir tür çöp içerdiği hemen anlaşılır, nereden geldiğini bulmak ve değişkenin olduğunu görmek kolaydır. başlatma olmadan kullanılır.

Bu yüzden kişisel olarak, zaten doldurulmuş bir diziyi ilan etmenin doğru uygulama olduğunu düşünüyorum. Bu sadece WRONG_VALUE alınması gereken değerlerdir.

Değişkenlerin ve hatta dizilerin başlatılmasına hiç karşı değilim. Örneğin bunun gibi

 int ExtHandle[ 21 ] = {};

ayrıca başlatılmış bir dizi olacaktır. Ancak bu özel durumda bu bile gerekli değildir, çünkü OnInit()'de tüm dizi doldurulur. O yüzden bir ihtiyaç görmüyorum. Ve elmaları ile Pinokyo bile burada yuvarlanmaz, çünkü değerleri kullanmadan (okumadan) önce zaten başlatılacaktır.

 
Alexey Viktorov # :

Değişkenlerin ve hatta dizilerin başlatılmasına hiç karşı değilim. Örneğin bunun gibi

ayrıca başlatılmış bir dizi olacaktır. Ancak bu özel durumda bu bile gerekli değildir, çünkü OnInit()'de tüm dizi doldurulur. O yüzden bir ihtiyaç görmüyorum. Ve elmaları ile Pinokyo bile burada yuvarlanmaz, çünkü değerleri kullanmadan (okumadan) önce zaten başlatılacaktır.

Eee... Peki nerede "başlatılacak"? Koda göre - böyle bir dizi çöple doldurulacak.

Benim düşünceme göre, dediğim gibi, yaratmayı geçersiz değerlerle başlatmak iyi bir uygulamadır:

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

Tabii dizi büyükse bu yöntemle doldurmak mantıksız oluyor bu durumda büyük bir diziyi bile geçersiz değerlerle doldurduğum DEBUG sürümünü kullanıyorum ama RELEASE sürümünde dolgu yok.

Bu uygulama beni defalarca başlatılmamış değişkenleri kullanmaktan kurtardı.

 
SanAlex # :

Koddaki adınız - gönderdiğiniz kod, bilmek için adınızın altında oluşturdum. Ama çalışmadı.


Peki, çarpık ellerin için kim suçlanacak?

Resim, hesaplanan değerin 9.08253 olduğunu ve dönüşümden sonra 9.08 olduğunu gösteriyor ve bana 16. ondalık basamağı söyleme.

Ve bir şey daha, eğer değer minimum hacimden küçükse

Göstermek için başka bir değişken tanıtmak zorunda kaldım ...

 
Georgiy Merts # :

Eee... Peki nerede "başlatılacak"? Koda göre - böyle bir dizi çöple doldurulacak.

Bence, dediğim gibi, yaratmayı geçersiz değerlerle başlatmak iyi bir uygulamadır:

Tabii dizi büyükse bu yöntemle doldurmak mantıksız oluyor bu durumda büyük bir diziyi bile geçersiz değerlerle doldurduğum DEBUG sürümünü kullanıyorum ama RELEASE sürümünde dolgu yok.

Bu uygulama beni defalarca başlatılmamış değişkenleri kullanmaktan kurtardı.

Burada, özel bir döngüde. Ve sadece bir diziden bahsettiğime dikkat edin.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

MQL5 dilini sıfırdan kendi kendine öğrenme

SanAlex , 2021.11.29 07:17

Ne demek istediğini anlamıyorum? Şahsen kendi ellerimle yaptım, neden bahsediyorsun? terminalden gelen kod, ancak yöntemin kendisi, test cihazında birkaç çift için açıklıkların nasıl uygulanacağı, sonucu şahsen kendim elde ettim.

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

bana kodu nereden aldığımı göster?

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

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


Diyaloğumuzla ilgili olmayan her şeyi koddan kaldırdım. Eh, neredeyse her şey...

 
Alexey Viktorov # :

Burada, özel bir döngüde. Ve sadece bir diziden bahsettiğime dikkat edin.

Evet bu doğru. Bana göre normal uygulama.

 
SanAlex # :

Bu neredeyse hazır - çalışmayan ekstra işlevleri kaldırmanız yeterli. Bu çok para birimli Uzman Danışmanı bu "MACD Sample.mq5"ten aldım

Sanki işe yaraması için gereksiz her şeyi kaldırmayı başardım. Yine de aklıma getirmek ve sonra buraya uzanmak gerekiyor.

Ekran görüntüsü 2021-11-29 155519

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

İşte şimdiye kadar yaptıklarım - belki başka biri daha iyisini yapabilir

Dosyalar:
00001_Mult.mq5  15 kb
 
Alexey Viktorov # :

Bunu gerçekten yazmamışsınızdır umarım...

İşte çalışma fonksiyonu

Tam serbest marjdan hesaplamamak için sadece risk miktarını girmek yeterlidir ...

Herkese iyi günler ve iyi bir ruh hali!

Çok uzun bir süre dizileri anladım ve çalıştım, ancak sonuç zaten orada çünkü. 12 döviz çifti için riski hesaplayan bir fonksiyonun kodunu bağımsız olarak yazdı.

Saygılarımla, Vladimir.

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

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