MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 852

 
siteye erişilemiyor
 

Merhaba geliştiriciler,

Özel tarih veya herhangi bir tarih seçeneği ile herhangi bir strateji test cihazını görüntüleyin

Resmi görmek:

strateji test cihazı

İstediğim şey programımdaki başlangıç ve bitiş tarihi değerlerini OnInit() fonksiyonunda alabilmem.

Onu nasıl alabilirim?

 
Artyom Trishkin :

Tüm döngüyü bir işleve dönüştürün ve bulunursa ondan çubuk numarasını veya bulunmazsa WRONG_VALUE - döndürün.


Tünaydın. Tamamlandı, dünün sorunlu iCustom'u ile çalışıyor gibi görünüyor. Her şeyi bir fonksiyon olarak tasarladım, kontrol için " Yorum " ve "Yazdır" uyguladım.

Bu deneme EA'nın amacı, iCrossAD göstergesinden Yukarı/Aşağı okları şeklindeki sinyalleri yakalamak ve bunları gelecekteki programda kullanılacak bir AL veya SAT komutuna dönüştürmektir.

Yeterli deneyimim yok, bu yüzden kesin olarak yargılamamanızı rica ediyorum, ancak bunu yapmanın daha iyi olduğuna dair makul eleştiri ve tavsiyeler memnuniyetle karşılanır.

Bu yazıyı tam da bu yüzden yazdım. Danışman ve gösterge dosyalarını ekliyorum, kod aşağıdadır.

 //+------------------------------------------------------------------+
//|                                                  Test_iCusom.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property description ""
#property strict
//--- includes
#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---
enum Indicator_Direction
   {
   Direction_BUY,
   Direction_SELL,
   Direction_FLAT
   };
//---
input string    Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD" ; //----- "Внешние параметры индикатора iCrossAD" -----
input uint      InpPeriodFind           = 400 ;                 // Bars for calculate
input uint      InpUnheckedBars         = 2 ;                   // Unchecked bars
input uint      InpPeriodIND            = 21 ;                   // CCI period

//--- global variables

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

int             CrossAD;                           //Хэндл индикатора iCrossAD

double          Buf_Arrow_Sell[],                   //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
               Last_Arrow_Sell_volume,             //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
               Last_Arrow_Sell_index;             //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossAD
datetime        Last_Arrow_Buy_time;               //Переменная для записи времени стрелки
               
double          Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
datetime        Last_Arrow_Sell_time;
   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   ArraySetAsSeries (Buf_Arrow_Buy, true );
   ArraySetAsSeries (Buf_Arrow_Sell, true );
//---
   CrossAD = iCustom (asymbol.Name(), _Period , "iCrossAD" ,InpPeriodFind,InpUnheckedBars,InpPeriodIND);
   if (CrossAD == INVALID_HANDLE )
   {
       Print ( "Не удалось создать описатель индикатора iCrossAD!" );
       return ( INIT_FAILED );
   }
       else Print ( "Хендл iCrossAD = " ,CrossAD);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- delete objects
   ObjectsDeleteAll ( 0 , "" ,- 1 );
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
  
   string direction = "no information" ;
   switch (iCustom_iCrossAD(InpPeriodFind))
      {
       case Direction_BUY: direction = "BUY" ;
         break ;
       case Direction_SELL: direction = "SELL" ;
         break ;
       case Direction_FLAT: direction = "FLAT" ;
         break ;
       case WRONG_VALUE : direction = "no information" ;
         break ;   
      }
   Comment ( "-------------------------" , 
             "\n Last_Arrow_Buy_volume     = " ,Last_Arrow_Buy_volume,
             "\n Last_Arrow_Buy_index        = " ,Last_Arrow_Buy_index,
             "\n Last_Arrow_Buy_time         = " ,Last_Arrow_Buy_time,
             "\n ---------------------- " ,
             "\n Last_Arrow_Sell_volume     = " ,Last_Arrow_Sell_volume,
             "\n Last_Arrow_Sell_index        = " ,Last_Arrow_Sell_index,
             "\n Last_Arrow_Sell_time         = " ,Last_Arrow_Sell_time,
             "\n ---------------------- " ,
             "\n Indicator_Direction             = " ,direction
            ); 
  }
//+------------------------------------------------------------------+
int iCustom_iCrossAD( uint PeriodFind) 
  { 
   Indicator_Direction direct = Direction_FLAT;
   
   if ( CopyBuffer (CrossAD, 1 , 0 , PeriodFind, Buf_Arrow_Buy) != PeriodFind)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ( WRONG_VALUE );
      }
         for ( int n= 0 ; n<( int )PeriodFind; n++)
            {
               if (n== 0 )
                   Print ( "Last_Arrow_Buy_index n==" ,n, " Last_Arrow_Buy_time = " , iTime ( _Symbol , 0 ,n));
               if (Buf_Arrow_Buy[n]== EMPTY_VALUE )
                   Print ( "Last_Arrow_Buy_index n==" ,n, " Last_Arrow_Buy_time = " , iTime ( _Symbol , 0 ,n));
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Buy_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Buy_time   = iTime ( _Symbol , 0 ,n);
                  Last_Arrow_Buy_index  = n;
                   Print ( "Last_Arrow_Buy_volume = " ,Last_Arrow_Buy_volume, ", Last_Arrow_Buy_index = " ,Last_Arrow_Buy_index, ", Last_Arrow_Buy_time = " ,Last_Arrow_Buy_time);
                   break ;
               }   
            }
         
   if ( CopyBuffer (CrossAD, 2 , 0 , PeriodFind, Buf_Arrow_Sell) != PeriodFind)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ( WRONG_VALUE );
      }
         for ( int n= 0 ; n<( int )PeriodFind; n++)
            {
               if (n== 0 )
                   Print ( "Last_Arrow_Sell_index n==" ,n, " Last_Arrow_Sell_time = " , iTime ( _Symbol , 0 ,n));
               if (Buf_Arrow_Sell[n]== EMPTY_VALUE )
                   Print ( "Last_Arrow_Sell_index n==" ,n, " Last_Arrow_Sell_time = " , iTime ( _Symbol , 0 ,n));
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Sell_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Sell_time   = iTime ( _Symbol , 0 ,n);
                  Last_Arrow_Sell_index  = n;
                   Print ( "Last_Arrow_Sell_volume = " ,Last_Arrow_Sell_volume, ", Last_Arrow_Sell_index = " ,Last_Arrow_Sell_index, ", Last_Arrow_Sell_time = " ,Last_Arrow_Sell_time);
                   break ;
               }
            }
   if (Last_Arrow_Buy_index < Last_Arrow_Sell_index)direct = Direction_BUY;
       else if (Last_Arrow_Buy_index > Last_Arrow_Sell_index)direct = Direction_SELL;
         else direct = Direction_FLAT;         
   return (direct); 
       //return(WRONG_VALUE); 
  }
//+------------------------------------------------------------------+
Dosyalar:
iCrossAD.mq5  49 kb
 
İyi günler, EA'da başka bir sipariş tetiklendiğinde bekleyen siparişleri silme işlevi vardır. Bu işlevi devre dışı bırakmanın mümkün olacağı harici parametrelere nasıl kayıt olunur. Şimdiden teşekkür ederim.
Dosyalar:
ths42o20.txt  1 kb
 

Merhaba!

Göstergeyi MT4'ten MT5'e yeniden kodladı. Göstergeyi eklenti olarak kullanmak istiyorum. filtre.

MT5'i yeni öğreniyorum. Ancak hatayı bulamıyorum. MT4 ve MT5'teki ekran farklıdır.

Uzmanlara danışın - *.mql5 dosyasında bir hata bulmama yardım edin

Kaynak kodları ektedir.

Yardımlarınız için şimdiden teşekkür ederiz.

Dosyalar:
ReVoIn.mq4  4 kb
ReVoIn.mq5  11 kb
 
Priffekt :
İyi günler, EA'da başka bir sipariş tetiklendiğinde bekleyen siparişleri silme işlevi vardır. Bu işlevi devre dışı bırakmanın mümkün olacağı harici parametrelere nasıl kayıt olunur. Şimdiden teşekkür ederim.
DeleteOppositeOrders();
void DeleteOppositeOrders() {
   bool fd, fep1, fep2;

  fep1=ExistPosition( 1 );
  fep2=ExistPosition( 2 );

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderSymbol()== Symbol ()) {
        fd=False;
         if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) {
           if (fep2) fd=OrderDelete(OrderTicket());
        }
         if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {
           if (fep1) fd=OrderDelete(OrderTicket());
        }
         if (fd && UseSound) PlaySound (NameFileSound);
      }
    }
  }
}
bool ExistPosition( int mn) {
   bool Exist=False;
   for ( int i= 0 ; i< OrdersTotal (); i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderSymbol()== Symbol () && OrderMagicNumber()== Magik) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break ;
        }
      }
    }
  }
   return (Exist);
}

Bu sizin kodunuz, bu yüzden eklemek daha iyidir.

 

Tabii ki danışman rolüne pek uygun değilim ama görev zor görünmüyor.

Lütfen kodunuzun kendisine uymadığımı unutmayın, benim için (bir çaydanlık) bile çok tartışmalı olan çok şey var, işlevinizin void türünde olması gerçeğinden başlayarak. Bu tip, bir fonksiyonun bir değer döndürmediğini belirtmek için kullanılır veya fonksiyon parametresi olarak, parametrelerin yokluğunu belirtir. Ve kodunuzun sonunda - return(Var);

Gelen bir değişken bildirin, bunu işlevinize parametre olarak yazın ve 'gelen' değişkeni False olarak ayarlanmışsa işlevden çıkın.

 
input bool On_Off = true;
DeleteOppositeOrders(On_Off);
void DeleteOppositeOrders(bool on_off) {

  if(on_off==false)return;

  bool fd, fep1, fep2;

  fep1=ExistPosition(1);
  fep2=ExistPosition(2);

  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol()) {
        fd=False;
        if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) {
          if (fep2) fd=OrderDelete(OrderTicket());
        }
        if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {
          if (fep1) fd=OrderDelete(OrderTicket());
        }
        if (fd && UseSound) PlaySound(NameFileSound);
      }
    }
  }
}
bool ExistPosition(int mn) {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
  return(Exist);
}
 
Priffekt :
İyi günler, EA'da başka bir sipariş tetiklendiğinde bekleyen siparişleri silme işlevi vardır. Bu işlevi devre dışı bırakmanın mümkün olacağı harici parametrelere nasıl kayıt olunur. Şimdiden teşekkür ederim.

Kodunuzun metninde tüm Yanlış ve Doğruları bulun. Bunları yanlış ve doğru ile değiştirin. Bu dil büyük/küçük harfe duyarlıdır.

 
Sergey Voytsekhovsky :

Kodunuzun metninde tüm Yanlış ve Doğruları bulun. Bunları yanlış ve doğru ile değiştirin. Bu dil büyük/küçük harfe duyarlıdır.

İyi günler, tüm değerleri değiştirdim, ancak uzman ayarlarında işlevin kendisini devre dışı bırakma olasılığıyla ilgileniyorum.
 DeleteOppositeOrders();
void DeleteOppositeOrders() {
  bool fd, fep1, fep2;

  fep1=ExistPosition(1);
  fep2=ExistPosition(2);

  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol()) {
        fd=yanlış;
        if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magic) {
          if (fep2) fd=OrderDelete(OrderTicket());
        }
        if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {
          if (fep1) fd=OrderDelete(OrderTicket());
        }
        if (fd && UseSound) PlaySound(NameFileSound);
      }
    }
  }
}
bool ExistPosition(int mn) {
  bool Var=yanlış;
  for (int i=0; i<SiparişlerToplam(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) {
        if (OrderType()==OP_BUY || OrderType()==OP_SEL) {
          var=doğru; kırmak;
        }
      }
    }
  }
  dönüş (var);
}