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

 
toni_stark : EA 1.5 yıl önce çalıştı, şimdi grafikte yüklü değil.

tezin teyidi: hareket = yaşam, dinlenme = ölüm. Bir dergide ne yazıyor? bunlar sağ alttaki iki sekme

Olsaydı kontrol edip düzeltirdim...

 

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

Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4

İlya Prozumentov , 2017.06.11 13:53

Bir diziyle çalışmak için bir sınıf şablonu vardır.
 #property strict
#include <ObjectVariables.mqh>
#include <Arrays\varQSort.mqh>
#include <Arrays\objQSort.mqh>

template < typename T1>
class ArrayList
{
   private :
      T1 array[];
      QuickSorts<T1> *qs;
       int size;
       int index;

   public :
       //прочие функции
       void QuickSort(); //отсортировать массив
       //прочие функции
};
//+------------------------------------------------------------------+
//| Сортировка массива
template < typename T1>
void ArrayList::QuickSort()
{
   int idx = index; //сохранение положения индекса
   if (IsPointer(array[ 0 ])) // true - массив содержит указатели класса
      qs /*ошибка 2*/ = new ObjQSort<T1>();
   else
      qs /*ошибка 2*/ = new VarQSort<T1>();
   qs.Sort(array, 0 , index);
   index = idx;
}

Bir dizinin karmaşık veri türlerini depolayabildiği gerçeği göz önüne alındığında, bu sınıf şablonunun sıralama uygulaması gerekir. Örneğin:
ArrayList<PP*> *dde; // PP - класс

Basit türler ve karmaşık olanlar için farklı işlevler yazabilirsiniz, ancak derleyici işlevlerin veri türüne göre kesinlikle sınırlandırıldığını anlamaz ve yemin etmeye devam eder:
'<' - geçersiz işlem ArrayList.mqh'yi kullanır

Sonra arayüzü gömmeye karar verdim:

 #property strict
template < typename T1>
interface QuickSorts
{
   void Sort(T1 &array[], int beg, int end);
};
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template < typename T1>
class VarQSort : public /*ошибка 1*/ QuickSorts
{
private :

public :
   void Sort(T1 &array[], int beg, int end);
   VarQSort(){}
   ~VarQSort(){}
};
template < typename T1>
void VarQSort::Sort(T1 &array[], int beg, int end)
{
   //алгоритм функции
}
 #property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template < typename T1>
class ObjQSort : public /*ошибка 1*/ QuickSorts
{
private :

public :
   void Sort(T1 &array[], int beg, int end){}
   ObjQSort(){}
   ~ObjQSort(){}
};

Tasarımın tüm parçaları derlenmiştir. Ama bunu beyan etmeye çalışırsanız:
ArrayList<PP*> *dde; // PP - класс
daha sonra, dosyayı derlerken hatalar şunlardır:

'QuickSorts' - şablon uyuşmazlığı varQSort.mqh /*hata 1*/
'=' - tür uyumsuzluğu ArrayList.mqh /*hata 2*/


Bu tür uyumsuzluğu ortadan kaldırmak için kodda nelerin düzeltilmesi gerekiyor? Neden böyle olduğunu anlamıyorum.

not
'<' - geçersiz işlem varQSort.mqh kullanımı
bu tasarımda beni rahatsız ediyor. Ve tam olarak kurtulmak istediğim şey buydu. Ama bu hata benim için açık, ama bu ikisi değil.
 template < typename T1>
class VarQSort : public QuickSorts <T1>
//....

template < typename T1>
class ObjQSort : public QuickSorts <T1>
//....
 
fxsaber :
Nitekim) Uyumsuzluk hatası ortadan kalktı ve ikincisi de onunla birlikte. Teşekkür ederim.
 
Selamlar sevgili forum kullanıcıları! Bir işleve bazı değişiklikler ekleme konusunda yardıma ihtiyacınız var.
 enum _EventYesNo{
      YES            = 1 ,           //ДА
      NO             = 2              //НЕТ
      };
enum howmuch {one = 1 ,               //Одна
              two = 2 ,               //Две
              three = 3              //Три
              };

input     _EventYesNo    monday                     = 2 ;                 //торгуем в ПОНЕДЕЛЬНИК?
input     howmuch        mondayHM                   = 1 ;                 //Сколько сделок?
input      string          monday_open1               = "00:00" ;           //
input      string          monday_open2               = "00:00" ;           //
input      string          monday_open3               = "00:00" ;           //

input     _EventYesNo    tuesday                    = 2 ;                 //торгуем во ВТОРНИК?
input     howmuch        tuesdayHM                  = 1 ;                 //Сколько сделок?
input      string          tuesday_open1              = "00:00" ;           //
input      string          tuesday_open2              = "00:00" ;           //
input      string          tuesday_open3              = "00:00" ;           //

input     _EventYesNo    wednesday                  = 2 ;                 //торгуем в СРЕДУ?
input     howmuch        wednesdayHM                = 1 ;                 //Сколько сделок?
input      string          wednesday_open1            = "00:00" ;           //
input      string          wednesday_open2            = "00:00" ;           //
input      string          wednesday_open3            = "00:00" ;           //

input     _EventYesNo    thursday                   = 2 ;                 //торгуем в ЧЕТВЕРГ?
input     howmuch        thursdayHM                 = 1 ;                 //Сколько сделок?
input      string          thursday_open1             = "00:00" ;           //
input      string          thursday_open2             = "00:00" ;           //
input      string          thursday_open3             = "00:00" ;           //

input     _EventYesNo    friday                     = 2 ;                 //торгуем в ПЯТНИЦУ?
input     howmuch        fridayHM                   = 1 ;                 //Сколько сделок?
input      string          friday_open1               = "00:00" ;           //
input      string          friday_open2               = "00:00" ;           //
input      string          friday_open3               = "00:00" ;           //

extern int         minutes = 5;          // Время торговли(минут) bool    HOUR = true;                     // Часы Вкл (true) / Выкл (folse) //Отправляет true если по времени разрешено торговать bool isTradeTimeString() { datetime servertime = TimeCurrent (); datetime localtime = TimeLocal (); datetime time = 0 ; datetime hbegin = 0 ; datetime hend = 0 ; string TimeBegin = "00:00" ; if ( DayOfWeek () == 1 ){ if (monday == 1 ){TimeBegin = monday_open1;} else { return ( false );}} if ( DayOfWeek () == 2 ){ if (tuesday == 1 ){TimeBegin = tuesday_open1;} else { return ( false );}} if ( DayOfWeek () == 3 ){ if (wednesday == 1 ){TimeBegin = wednesday_open1;} else { return ( false );}} if ( DayOfWeek () == 4 ){ if (thursday == 1 ){TimeBegin = thursday_open1;} else { return ( false );}} if ( DayOfWeek () == 5 ){ if (friday == 1 ){TimeBegin = friday_open1;} else { return ( false );}} string TimeEnd = TimeToString ( StrToTime (TimeBegin)+( 60 *minutes), TIME_MINUTES ); if (servertime > localtime) {   time = servertime - localtime;   hbegin = StrToTime (TimeBegin) + time;   hend = StrToTime (TimeEnd) + time; } if (servertime < localtime) {   time = localtime - servertime;   hbegin = StrToTime (TimeBegin) - time;   hend = StrToTime (TimeEnd) - time; } if (localtime == servertime) {   hbegin = StrToTime (TimeBegin);   hend = StrToTime (TimeEnd); } datetime dtBegin, dtEnd;         // Время начала и окончания работы int       hc, he;                 // Часы текущего времени и окончания работы dtBegin= StrToTime ( TimeToStr ( TimeCurrent (), TIME_DATE )+ " " + TimeToStr (hbegin, TIME_MINUTES )); dtEnd= StrToTime ( TimeToStr ( TimeCurrent (), TIME_DATE )+ " " + TimeToStr (hend, TIME_MINUTES )); hc = TimeHour ( TimeCurrent ()); he = TimeHour (dtEnd); if (dtBegin>=dtEnd) {    if (hc>=he)    dtEnd+= 24 * 60 * 60 ;    else    dtBegin-= 24 * 60 * 60 ; } if (HOUR== true ) {    if ( TimeCurrent ()>=dtBegin && TimeCurrent ()<=dtEnd)    return ( true );    else   {    if (CountTrades()== 0 )      return ( false );   } } return ( true ); }

Buna ihtiyacım var mesela Pazartesi günü 2 yada 3 tane fırsat açmanız gerekiyorsa fonksiyon zamanı karşılaştırıp emeği gönderiyor ama şimdilik benim için bir sefer karşılaştırıyor.


	          
 
Böylece, tekliflerin dışa aktarılmasında, hangi tarihten ve hangi tarihe kadar yüklemek istediğinizi seçebilirsiniz.

aksi halde "indir" butonuna tıkladığınızda 6.000.000 fiyat teklifi indirilir. herkes sabit diski alıntı verileriyle doldurmak, indirilene kadar uzun süre beklemek ve ardından alıntı tablosundaki gereksiz verileri kaldırmak istemez.

 

Merhaba canım ... SATIN AL siparişleri için belirtilen TrailingStop kodunun neden doğru çalıştığını söyleyen var mı?

       if ( OrderType ()== OP_BUY && ( Bid - 8 *D* Point )> OrderStopLoss ()&&( Bid - 8 *D* Point )> OrderOpenPrice ()) 
{chk= OrderModify ( OrderTicket (), 0 , NormalizeDouble ( Bid - 7 * Point , Digits ), NormalizeDouble ( OrderOpenPrice ()+ 25 *D* Point , Digits ), 0 , 0 );}

... ve SAT emirleri için benzerleri hiç SL belirlemez ...

       if ( OrderType ()== OP_SELL &&( Ask + 8 *D* Point )< OrderStopLoss ()&&( Ask + 8 *D* Point )< OrderOpenPrice ()) 
{chk= OrderModify ( OrderTicket (), 0 , NormalizeDouble ( Ask + 7 * Point , Digits ), NormalizeDouble ( OrderOpenPrice ()- 25 *D* Point , Digits ), 0 , 0 );}

... ve nedeni büyük olasılıkla ( Ask + 8 *D* Noktası )< OrderStopLoss () durumundadır , kaldırılırsa SL ayarlanır, ancak belirtilen koşul olmadan TrailingStop düzgün çalışmaz ...

SATIN AL emirleri için ( Bid - 8 *D* Point )> OrderStopLoss () koşulu,   OrderStopLoss ()==0 kabul edilir   doğru (yani bir değer > 0 ) ...

... ancak SATIŞ siparişleri için koşul ( Ask + 8 *D* Puan )< OrderStopLoss (), ne zaman   OrderStopLoss ()==0 kabul edilir   OLUMSUZLUK   doğru (yani, < 0 bir değer elde edilir) ...

Birisi bana SATIŞ emirleriyle TrailingStop'un doğru çalışması için kodda gerekli koşulu nasıl doğru bir şekilde formüle edeceğimi söyleyebilir mi ( Ask + 8 *D* Noktası )< OrderStopLoss () .

Cevap veren herkese şimdiden teşekkürler.

 

Tünaydın! Göstergenin kene geçmişi dosyasını okuduğu bir işlev vardır. Ancak gösterge yüklenirken veya güncellenirken okuma yalnızca bir kez gerçekleşir. Sıfır çubuğunun ilk işareti her göründüğünde okuma nasıl yapılır?

void ProcessOldCandles(int limit, TickStruct &lastTick)

{

      int hTicksFile = FileOpen(Symbol() + ".tks", FILE_BIN | FILE_READ | FILE_SHARE_READ | FILE_SHARE_WRITE);

   if (hTicksFile < 1)

      return;

      TickStruct tick;

   while (!IsStopped())

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

      if (tick.time >= Time[limit])

         break;

   }

   lastTick = tick;

   int barIndex = iBarShift(NULL, 0, tick.time);

      while (barIndex >= 0)

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

         if (!IsTickBelongToBar(tick, barIndex))

         barIndex = iBarShift(NULL, 0, tick.time);

         ProcessOneTick(barIndex, tick, lastTick);

   }

      FileClose(hTicksFile);

 
Yaroslav Nykula :

Merhaba canım ... SATIN AL siparişleri için belirtilen TrailingStop kodunun neden doğru çalıştığını söyleyen var mı?

... ve SAT emirleri için benzerleri hiç SL belirlemez ...

... ve nedeni büyük olasılıkla ( Ask + 8 *D* Noktası )< OrderStopLoss () durumundadır , kaldırılırsa SL ayarlanır, ancak belirtilen koşul olmadan TrailingStop düzgün çalışmaz ...

SATIN AL emirleri için ( Bid - 8 *D* Point )> OrderStopLoss () koşulu,   OrderStopLoss ()==0 kabul edilir   doğru (yani bir değer > 0 ) ...

... ancak SATIŞ siparişleri için koşul ( Ask + 8 *D* Puan )< OrderStopLoss (), ne zaman   OrderStopLoss ()==0 kabul edilir   OLUMSUZLUK   doğru (yani, < 0 bir değer elde edilir) ...

Birisi bana SATIŞ emirleriyle TrailingStop'un doğru çalışması için kodda gerekli koşulu nasıl doğru bir şekilde formüle edeceğimi söyleyebilir mi ( Ask + 8 *D* Noktası )< OrderStopLoss () .

Cevap veren herkese şimdiden teşekkürler.


Herkese merhaba ... forumun bu başlığında acı verici derecede düşük aktivite var ... bu sorun bu şekilde çözüldü ...

 if ( OrderSymbol ()== Symbol ()&& OrderType ()== OP_SELL && OrderLots ()<=Lot* 3 &&( Ask +(Tral+TP)*D* Point )< OrderOpenPrice ()&&(( OrderStopLoss ()!= 0 &&( Ask +Tral*D* Point )< OrderStopLoss ())|| OrderStopLoss ()== 0 ))
{chk= OrderModify ( OrderTicket (), 0 , NormalizeDouble ( Ask +Tral*D* Point , Digits ), NormalizeDouble ( OrderOpenPrice ()-Stepp*D* Point , Digits ), 0 , 0 );}} 

...biraz uzun bir durum ama çalışıyor... Daha kısa yazmayı bilenler kısaltabilir, cevap verebilir, minnettar kalırım ... Gerisi olduğu gibi kullanabilir.

 

fonksiyona gir

SiparişKapatByTicket (542534564)

tam lot büyüklüğüne sahip bir bilete bir siparişi kapatmak.

böylece lot, fiyat, kayma belirtmenize gerek kalmaz.

terminaldeki bir siparişte bir çarpı işaretine tıklamaya benzer.


fonksiyona gir

SiparişKapatByPos(0)

pozisyona göre bir siparişi kapatma.


ve o zaman bu hantal yapıları reçete etmek gerekli olmayacak.

  for ( int i = 1 ; i <= OrdersTotal () ; i ++ )       //Цикл по всем ордерам,..
     {                                        //отражённым в терминале
      if ( OrderSelect ( i - 1 , SELECT_BY_POS ) == true ) //Если есть следующий
        {                                     
         // Здесь должен выполняться ..
         // ..анализ характеристик ордеров 
        }
     }                                        //Конец тела цикла
 

Merhaba! İki eksi s x sayı q ve w yanlış karşılaştırılır, eşit olduklarında if operatörü birinin diğerinden büyük olduğunu düşünür.Hata nedir? q = -0.0002 ve w de -0.0002 olduğunda, res12=yanlış, neden?

 double SPREAD= MarketInfo (Symb, MODE_SPREAD ); // Спред
 static bool res12= true ;

start()
{   


   double q= High [ 0 ]- 3.0 * Point - High [ 1 ];
   double w=-SPREAD* Point ;
      
   if (New_Bar== true &&ticket1<= 0 )
     {
       if (q>w)
       {
        res12= false ; 
         Alert ("res12= false ");
         Alert (q);
         Alert (w);
       }
     }
       if (New_Bar== true &&ticket1<= 0 )
     {
         if (q<=w)
        {
         res12= true ;
         Alert ("res12= true ");
         Alert (q);
         Alert (w);
        }
      }





}