Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 70

 
Merhaba! Lütfen MT4'te bir fonksiyon yazarken yardım edin. Hesap bakiyesini biliyorum (Hesap Bakiyesi), kaç tane işlem açacağımı biliyorum (örneğin, 9) Riski biliyorum (örneğin, Hesap Bakiyesinin %3'ü), eğer varsa ilk işlemin lotunu hesaplamam gerekiyor. sonraki her lot ikiye katlanacak ve tüm anlaşmalar birer birer üst üste gelecek.
 //Функция расчета торгового лота
double GetLots()
{
 double clots = 0.0 ;
 double cl = NormalizeDouble ( MarketInfo ( Symbol (), MODE_MAXLOT ), 2 ); 
 double L2 = NormalizeDouble (cl * Multipler, 2 );
 double L3 = NormalizeDouble (L2 * Multipler, 2 );
 double L4 = NormalizeDouble (L3 * Multipler, 2 );
 double L5 = NormalizeDouble (L4 * Multipler, 2 );
 double L6 = NormalizeDouble (L5 * Multipler, 2 );
 double L7 = NormalizeDouble (L6 * Multipler, 2 );
 double L8 = NormalizeDouble (L7 * Multipler, 2 );
 double L9 = NormalizeDouble (L8 * Multipler, 2 );
 
 for (cl = NormalizeDouble ( MarketInfo ( Symbol (), MODE_MAXLOT ), 2 ); AccountFreeMarginCheck ( Symbol (), OP_BUY ,L9) <= ( AccountBalance ()/ 100 )*Risk;cl--)
 {
   if (! IsStopped ()) 
  {
   clots = NormalizeDouble (cl, 2 );
  }
 } 
 return (clots);
}

İşte olanlar. Lütfen bana neyin yanlış olduğunu söyle. Şimdiden teşekkürler!

 

Merhaba!

buraya yazıyorum çünkü mq4'te kimse yok gibi görünüyor.

Lütfen bana neyi yanlış yaptığımı söyle? 2. seçenek çalışmıyor.

 double A[][ 10 ];
int renge_A_one= 0 ;                                                     // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two= 0 ;                                                     // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][ 10 ];
int renge_B_one= 0 ;                                                     // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two= 0 ;                                                     // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B= 0 ;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one== ArrayRange (A, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_A_two== ArrayRange (A, 1 );                                     // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
     for ( int i= 0 ; i<range_A_one; i++)                                   // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize (B, count_B);
         for ( int j= 0 ; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one== ArrayRange (B, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_B_two== ArrayRange (B, 1 );                                     // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one== ArrayRange (A, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_A_two== ArrayRange (A, 1 );                                     // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
     for ( int i= 0 ; i<range_A_one; i++)                                   // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if (A[i][ 3 ]> 0 )
             {
              count_B++;
               ArrayResize (B, count_B);
               for ( int j= 0 ; j<renge_A_two; j++)                         // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one== ArrayRange (B, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_B_two== ArrayRange (B, 1 );                                     // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two
 
Arseniy Barudkin :
Merhaba! Lütfen MT4'te bir fonksiyon yazarken yardım edin. Hesap bakiyesini biliyorum (Hesap Bakiyesi), kaç tane işlem açacağımı biliyorum (örneğin, 9) Riski biliyorum (örneğin, Hesap Bakiyesinin %3'ü), eğer varsa ilk işlemin lotunu hesaplamam gerekiyor. sonraki her lot ikiye katlanacak ve tüm anlaşmalar birer birer üst üste gelecek.

İşte olanlar. Lütfen bana neyin yanlış olduğunu söyle. Şimdiden teşekkürler!

İlköğretim. Hata GetLots() işlevidir. Tüm işlev.
 
Leo59 :

Merhaba!

buraya yazıyorum çünkü mq4'te kimse yok gibi görünüyor.

Lütfen bana neyi yanlış yaptığımı söyle? 2. seçenek çalışmıyor.

 double A[][ 10 ];
int renge_A_one= 0 ;                                                     // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two= 0 ;                                                     // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][ 10 ];
int renge_B_one= 0 ;                                                     // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two= 0 ;                                                     // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B= 0 ;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
     renge_A_one == ArrayRange (A, 0 );                                      // Выясняем Размер первого измерения (число строк)
     renge_A_two == ArrayRange (A, 1 );                                      // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
     for ( int i= 0 ; i<range_A_one; i++)                                   // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize (B, count_B);
         for ( int j= 0 ; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
     renge_B_one == ArrayRange (B, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_B_two == ArrayRange (B, 1 );                                      // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one == ArrayRange (A, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_A_two == ArrayRange (A, 1 );                                     // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
     for ( int i= 0 ; i<range_A_one; i++)                                   // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if (A[i][ 3 ]> 0 )
             {
              count_B++;
               ArrayResize (B, count_B);
               for ( int j= 0 ; j<renge_A_two; j++)                         // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    r enge_B_one == ArrayRange (B, 0 );                                     // Выясняем Размер первого измерения (число строк)
    renge_B_two == ArrayRange (B, 1 );                                      // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two

Vurgulanan: Bir atama - "=" olmalı ve bir karşılaştırmanız var - "==".

 

Merhaba !
Mt4'te robot yazmayı öğreniyorum, ikili seçeneklerle başlamaya karar verdim. En basit Uzman Danışmanı yazıyorum ve derleyici başa çıkamadığım bir sürü uyarı veriyor (
Yardım: "MQL4 guruları hakkında" =))))))
Şimdiden teşekkürler!)

İşte danışman kodu.

//+------------------------------------------- --------------------+
//| Bolinger_Bands_traider.mq4 |
//| Telif hakkı 2017, Penrov Nikolay |
//| vk.com/buzamonolit |
//+------------------------------------------- --------------------+
#özellik telif hakkı "Telif hakkı 2017, Petrov Nikolay"
#özellik bağlantısı "vk.com/buzamonolit"
#özellik sürümü "1.00"
#mülkiyet katı
//+------------------------------------------- --------------------+
//| uzman başlatma işlevi |
//+------------------------------------------- --------------------+
extern int Bolinger_Bands = 20; // Bollinger Bantlarının Periyodu
dış çift Delta = 0.0003; // Bir siparişin hangi mesafede açılacağı

dize Symb; // Finansın adı. alet
int Toplam; // Sipariş sayısı

//+------------------------------------------- --------------------+
//| uzman başlatma işlevi |
//+------------------------------------------- --------------------+
int init()
{
//----
Initialize_Objects(0);
//----
dönüş(0);
}
//+------------------------------------------- --------------------+
//| uzman sıfırlama işlevi |
//+------------------------------------------- --------------------+
int tanım()
{
//----

//----
dönüş(0);
}
//+------------------------------------------- --------------------+
//| uzman başlatma işlevi |
//+------------------------------------------- --------------------+
int başlangıç()
{
//----
çift fiyat = Teklif;
double CurrBol_High = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_UPPER, 0);
double CurrBol_Low = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_LOWER, 0);
double PriceBol_High = fiyat - CurrBol_High;
double PriceBol_Low = fiyat - CurrBol_Low;
datetime NextClose = Time[0] + Period()*60*2;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1;
int hata;

// Siparişler için muhasebe
Sembol=Sembol(); // fin.instr'nin adı.
toplam=0; // Sipariş sayısı
for(int i=1; i<=OrdersTotal(); i++) // Sipariş üzerinden döngü
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Sonraki Varsa
{ // Siparişlerin analizi:
eğer (OrderSymbol()!=Symb)devam ederse; // Bizim Fincemiz değil. alet
if (OrderType()>1) // Beklemede
{
Alert("Bekleyen bir sipariş algılandı. Expert Advisor çalışmıyor.");
dönüş(0); // başlangıçtan çık()
}
Toplam++; // Pazar sayacı kalabalık
if (Toplam>1) // Birden fazla sipariş yok
{
Alert("Çoklu piyasa emirleri. Expert Advisor çalışmıyor.");
dönüş(0); // başlangıçtan çık()
}
}
}

ObjectSetText("Obj_Label", "TF" + Period() + ", " + DoubleToStr(fiyat, 5) + ", tick " + TimeToStr(TimeCurrent(), TIME_SECONDS) + ", O@" + TimeToStr(Time[0 ], TIME_MINUTES) + ", NC@" + TimeToStr(NextClose, TIME_MINUTES) + " (" + MinutesToNextClose + " dk)", 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label2", "Siparişler: " + Toplam + ", delta " + DoubleToStr(Delta,5) + ", MA'ya uzaklık:" + DoubleToStr(PriceBol_High, 5), 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label3", "Siparişler: " + Toplam + ", delta " + DoubleToStr(Delta,5) + ", MA'ya uzaklık:" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen );


// fiyat analizi ve açılış emirleri

if ((MathAbs(PriceBol_Low) < Delta) && (fiyat > CurrBol_Low) && (Açık[0] > CurrBol_Low+Delta) && (Toplam<1))
{
if (OrderSend(Symbol(), OP_BUY, 1.00,Bid , 3, 0, 0,"BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Green) >0) Print("Opened OK");
başka
{
err=GetLastError();
print("hata(",hata,")");
dönüş(0);

}
Print("ÇAĞRI @ " + fiyat + " " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);

}

if ((MathAbs(PriceBol_High) < Delta) && (fiyat < CurrBol_High) && (Açık[0] < CurrBol_Yüksek-Delta) && (Toplam<1))
{
if (OrderSend(Symbol(), OP_SELL, 1.00,Bid , 3, 0, 0,"BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Red) > 0) Print("Opened OK");
başka
{
err=GetLastError();
print("hata(",hata,")");
dönüş(0);

}
Yazdır ("PUT @ " + fiyat + " " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);

}

//----
dönüş(0);
}
//+------------------------------------------- --------------------+

int Initialize_Objects(int Win) // Kullanıcı Fonksiyonu
{ // ..nesne oluşturma
ObjectCreate("Obj_Label",OBJ_LABEL, Win, 0,0); // Bir nesne oluştur
ObjectSet("Obj_Label", OBJPROP_CORNER, 0); // Köşeye yasla
ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13); // X koordinatı
eğer (Kazanç==0)
ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);// Y koordinatı
başka
ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);// Y koordinatı

ObjectCreate("Obj_Label2",OBJ_LABEL, Kazan, 0,0); // Bir nesne oluştur
ObjectSet("Obj_Label2", OBJPROP_CORNER, 0); // Köşeye yasla
ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13); // X koordinatı
eğer (Kazanç==0)
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);// Y koordinatı
başka
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);// Y koordinatı

ObjectCreate("Obj_Label3",OBJ_LABEL, Kazan, 0,0); // Bir nesne oluştur
ObjectSet("Obj_Label3", OBJPROP_CORNER, 0); // Köşeye yasla
ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13); // X koordinatı
eğer (Kazanç==0)
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);// Y koordinatı
başka
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);// Y koordinatı

dönüş(0); // Kullanıcı işlevinden çık
}

 

Ve işte uyarılar. neyi sevmediğini anlayamıyorum


tür dönüşümü nedeniyle olası veri kaybı Bolinger_Bands_traider.mq4 51 24
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 76 35
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 76 227
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 77 43
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 78 43
'dize'den 'sayıya' örtük dönüştürme Bolinger_Bands_traider.mq4 85 71
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 93 23
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 93 91
'dize'den 'sayıya' örtük dönüştürme Bolinger_Bands_traider.mq4 99 72
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 107 23
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 107 91
0 hata(lar), 11 uyarı(lar), derleme süresi: 204 msn 1 12

 
Vitalie Postolache :
İlköğretim. Hata GetLots() işlevidir. Tüm işlev.

Nasıl doğru yazacağımı söyler misin? Maksimum lottan yineleyerek bir döngü kullanarak hesaplamak istedim.
 
Arseniy Barudkin :

Nasıl doğru yazacağımı söyler misin? Maksimum lottan yineleyerek bir döngü kullanarak hesaplamak istedim.


mantık nerede? İlk siparişte izin verilen maksimum lotu koyarsınız ve sonraki her sipariş için artırırsınız. En hafif tabirle bunun çok makul olmadığını düşünmüyor musunuz?

Ayrıca, döngüde, tamamen mantıksız bir yöntemle birinci dereceden partiyi azaltırsınız ve bundan önce "hesaplanan" diğer siparişlerin çoğu değişmeden kalır, ayrıca bu değerler sınırlarının ötesine geçmez. bu işlev . O zaman neden onlar?

Döngü artışının gerçek bir sayı olamayacağı gerçeğinden bahsetmiyorum bile, bu bir sayaçtır, bir tam sayı olmalıdır. Ve lotun değerini bir sayaç olarak ayarlarsınız ve her yinelemeden birer birer çıkarırsınız. Bu büyük bir hatadır, çok ciddi bir hatadır.

Mantığı önce kafanızda düzeltin, ardından koda çevirmeye çalışın.

 
bog_v_nas :

Ve işte uyarılar. neyi sevmediğini anlayamıyorum


tür dönüşümü nedeniyle olası veri kaybı Bolinger_Bands_traider.mq4 51 24
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 76 35
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 76 227
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 77 43
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 78 43
'dize'den 'sayıya' örtük dönüştürme Bolinger_Bands_traider.mq4 85 71
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 93 23
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 93 91
'dize'den 'sayıya' örtük dönüştürme Bolinger_Bands_traider.mq4 99 72
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 107 23
'sayı'dan 'string'e örtük dönüştürme Bolinger_Bands_traider.mq4 107 91
0 hata(lar), 11 uyarı(lar), derleme süresi: 204 msn 1 12

51 numaralı bir satır yazdırın, çünkü "Tür dönüşümü nedeniyle olası veri kaybı Bolinger_Bands_traider.mq4 51 24" hatasını anlamak için burada hesaplama yapmayın

Gerisi: "'sayıdan' 'string' Bolinger_Bands_traider.mq4 107 91'e örtük dönüştürme" ihtiyacınız olanı söylüyor:

sayısal değerleri, nesneyi oluşturduğumuz bir metin dizesine çevirin - örneğin bir metin dizesi

Dönem()

olmalı

DoubleToString(Periyot(),0)

 
Renat Akhtyamov :

sayısal değerleri, nesneyi oluşturduğumuz bir metin dizesine çevirin - örneğin bir metin dizesi

Dönem()

olmalı

DoubleToString(Periyot(),0)


Ve ne zamandan beri nokta tipi Double ?