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

 
Valeriy Yastremskiy :

Günde 1440 sipariş varsa, bir dakikanın başlangıcı için veya daha basit bir şekilde bir dakika çubuğunun görünümü için bir kontrol olmalıdır. Ve şu anda açık. Sizde yok, bu nedenle danışman, mevcut teklifteki sembolümüzdeki koşula göre, kendi başına zor bir koşul olan her onay işareti için bir pozisyon açar. Bu koşul karşılanabilir veya karşılanmayabilir ve keneler atlanır. Ve bir noktada kritik bir hata oluşur.

Ayrıca, emir yürütme türü (bir pozisyon oluşturmak için bir anlaşma yapmak için emir) Ya hep ya hiç.

Anladım. Yardım için teşekkürler.

Bir danışmanın bu kadar çok sipariş açmasının zor olduğunu hemen düşündüm. Bu kodla sipariş sayısını sınırlamaya çalıştım

 MqlDateTime time_now;
TimeCurrent (time_now);
if (time_now.hour== 10&&&&time_now.min==0 )
{
// открыть ордер
}

Yani, sadece 10:00'da bir sipariş açın. Ama sonuç aynı.

2020.10.27 10:25:17.548 çekirdek 1 36 Mb geçmiş verileri, 64 Mb onay verileri dahil olmak üzere 272 Mb bellek kullanıldı


 input int       StopLoss= 30 ;       // Stop Loss
input int       TakeProfit= 100 ;   // Take Profit
input double    Lot= 0.1 ;           // Количество лотов для торговли
int A;     //

//+------------------------------------------------------------------+
void OnTick ()
  {
//Print( "====================================================",  TimeCurrent() )   ;
//--- Объявляем структуры, которые будут использоваться для торговли
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;     // Будет использоваться для получения результатов выполнения торговых запросов
    MqlDateTime time_now;      // Будет использоваться для
   
 TimeCurrent (time_now);   
 if (! SymbolInfoTick ( _Symbol ,latest_price))
 if (time_now.hour== 10 &&time_now.min== 0 )
   {
         mrequest.action = TRADE_ACTION_DEAL ;                                   // немедленное исполнение
         mrequest.price = NormalizeDouble (latest_price.bid, _Digits );           // последняя цена Bid
         mrequest.sl = NormalizeDouble (latest_price.ask + StopLoss* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.ask - TakeProfit* _Point , _Digits ); // Take Profit
         mrequest.symbol = _Symbol ;                                             // символ
         mrequest.volume = Lot;                                                 // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL ;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING _RETURN ;                             // тип исполнения ордера - все или ничего
         mrequest.deviation= 100 ;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend (mrequest,mresult);
    }   
     return ;
  }

Neyi yanlış yapıyorum?

Eklediğim ve değiştirdiğim kodu vurguladım

İşte günlük dosyasında yazılanlar

FD 0 10:57:05.453 çekirdek 1 ajan süreci 127.0.0.1:3000 tarihinde başladı

CS 0 10:57:05.453 çekirdek 1 127.0.0.1:3000'e bağlanıyor

JD 0 10:57:05.953 çekirdek 1 bağlı

OD 0 10:57:05.975 çekirdek 1 yetkili (aracı derleme 2650)

JL 0 10:57:05.980 test cihazı EURUSD,M1 (Alpari-MT5-Demo): 2020.09.01 00:00'dan 2020.09.10 00:00'a kadar Experts\GRAIL.ex5 testi

ÜZERİNDE 0 10:57:05.997 çekirdek 1 ortak senkronizasyon tamamlandı

CJ 0 10:57:06.223 test cihazı analiz edilen geçmişin kalitesi %100

LM 0 10:57:06.248 çekirdek 1 MetaTester 5 127.0.0.1:3000'de başladı

EJ 0 10:57:06.248 çekirdek 1 başlatma tamamlandı

LS 0 10:57:06.248 çekirdek 1 giriş (2650 oluştur)

KO 0 10:57:06.248 çekirdek 1 4372 bayt hesap bilgisi yüklendi

LI 0 10:57:06.248 çekirdek 1 1482 bayt test cihazı parametresi yüklendi

FN 0 10:57:06.248 çekirdek 1 1724 bayt giriş parametresi yüklendi

TAMAM 0 10:57:06.248 çekirdek 1 423 bayt sembol listesi yüklendi (72 sembol)

HO 0 10:57:06.248 çekirdek 1 uzman dosyası eklendi: Experts\GRAIL.ex5. 13680 bayt yüklendi

KP 0 10:57:06.248 çekirdek 1 4077 Mb kullanılabilir, kene oluşturmak için 50 blok seti

DI 0 10:57:06.248 çekirdek 1 pip cinsinden kârı hesaplayın, ilk depozito 10000, kaldıraç 1:100

LP 0 10:57:06.248 çekirdek 1 başarıyla başlatıldı

Rİ. 0 10:57:06.248 çekirdek 1 15 Kb toplam başlatma verisi alındı

DN 0 10:57:06.248 çekirdek 1 Intel Core i5-6400 @ 2.70GHz, 7883 MB

IG 0 10:57:06.248 çekirdek 1 EURUSD: senkronize edilecek sembol

RS 0 10:57:06.248 çekirdek 1 EURUSD: sembol senkronize edildi, 3720 bayt sembol bilgisi alındı

OL 0 10:57:06.248 çekirdek 1 EURUSD: 0:00:00.003'te senkronize etmek için 27 bayt geçmiş verisi yükleyin

EK 0 10:57:06.248 çekirdek 1 EURUSD: geçmiş 2019.01.02 ile 2020.10.23 arasında senkronize edildi

LK 0 10:57:06.248 çekirdek 1 EURUSD,M1: 628432 çubuk için ayrılmış geçmiş önbelleği ve 2019.01.02 06:00 ile 2020.08.31 23:59 arasında 619175 çubuk içerir

sol 0 10:57:06.248 çekirdek 1 EURUSD,M1: tarih 2019.01.02 06:00'dan başlıyor

LN 0 10:57:06.248 çekirdek 1 EURUSD,M1 (Alpari-MT5-Demo): OHLC çubuğu durumları üretiyor. Çubuk üzerinde yürütülen OnTick yalnızca başlar

JM 0 10:57:06.248 çekirdek 1 EURUSD,M1: Experts\GRAIL.ex5'in 2020.09.01 00:00'dan 2020.09.10 00:00'a kadar testi şu girdilerle başladı:

LS 0 10:57:06.248 çekirdek 1 StopLoss=30

PL 0 10:57:06.248 çekirdek 1 Kâr Al=100

FJ 0 10:57:06.248 çekirdek 1 parti = 0.1

D.P. 0 10:57:06.248 çekirdek 1 nihai bakiye 10000.00 pip

EE 0 10:57:06.248 çekirdek 1 EURUSD,M1: 39553 kene, 10068 çubuk üretildi. Ortam 0:00:000.031'de senkronize edildi. Test 0:00:00.247'de geçti (0:00:00.016 ön işleme keneleri dahil).

DE 0 10:57:06.248 çekirdek 1 EURUSD,M1: oturum açmadan testi durdurmaya kadar geçen toplam süre 0:00:00.278 (geçmiş veri senkronizasyonu için 0:00:00.031 dahil)

NQ 0 10:57:06.248 çekirdek 1 36 Mb geçmiş verileri, 64 Mb onay verileri dahil olmak üzere 272 Mb bellek kullanıldı

KE 0 10:57:06.248 çekirdek 1 günlük dosyası "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" yazıldı

işletim sistemi 0 10:57:06.260 çekirdek 1 bağlantı kapandı


 
Denis Diakonov :

Lütfen bana söyle!

Yeni keneler geldiğinde sunucu zamanı neden güncellenmiyor?

Danışmanı başlatma anında her şey olması gerektiği gibi çalışır, ancak daha sonra zaman geçer ve mevcut dakikanın yeni değeri değişkene girmez.

Onlar. danışmanım int M = TimeMinute(TimeCurrent()); değişkeninin aldığı sayıya bağlı olarak çalışır.

Aslında, kod satırı referans kitabından ve hatta çalışmıyor.

Örneğin 12 dakika içinde başlatıldı -   şimdiki zaman   sunucu tarafından döndürülen değişkendeki zamana karşılık gelir ve daha sonra saat zaten 15-20 dakika olmasına rağmen değişken 12'de kalır

Kod tamamen daha iyidir, daha doğrusu işlevi nerede yarattığınız ve hangi işlevde (OnInit, OnTick, OnTime) dakika değerini alıp yazdırma işlevini çağırırsınız. OnInit içindeyse veya terminal fonksiyon alanlarının dışındaysa, öyle olmalıdır. OnTick'teyse, her tike yazdıracak ve değeri yeni bir dakikayla güncelleyecektir.

 

Sunucu zamanı ve değişken değerinin açıklayıcı bir örneği

Valeriy Yastremskiy :

Kod tamamen daha iyidir, daha doğrusu işlevi nerede yarattığınız ve hangi işlevde (OnInit, OnTick, OnTime) dakika değerini alıp yazdırma işlevini çağırırsınız. OnInit'te veya terminal fonksiyonlarının alanlarının dışındaysa, öyle olmalıdır. OnTik'te ise, her tikte değeri yeni bir dakika ile yazdıracak ve güncelleyecektir.

 int M = TimeMinute( TimeCurrent ());
bool TimeServer()                                                  
{  
   Print (M, " - Tекущее время сервера" );
   if ((M > 55 || M == 55 ) && (M < 59 || M == 59 ))
   {
   return ( true );
   }
   else
   {
   return ( false );
   }
}

Pekala, işte kod tamamen, hepsi bu kadar. void OnTick() işlevinde, yürütülecek ilk satır olarak en baştan başlatılır.

Yalnızca yeniden derleme veya grafiğe/silme alanına/ eklendiği anda tetiklenir. Zamanın geri kalanında, M değişkeni, EA ilk başlatıldığında alınan dakikanın değerini tutar.

 
Denis Diakonov :

Pekala, işte kod tamamen, hepsi bu kadar. void OnTick() işlevinde, yürütülecek ilk satır olarak en baştan başlatılır.

Yalnızca yeniden derleme veya grafiğe/silme alanına/ eklendiği anda tetiklenir. Zamanın geri kalanında, M değişkeni, EA ilk başlatıldığında alınan dakikanın değerini tutar.

 //--------------------------------------------------------------------
//
//--------------------------------------------------------------------
int m1,m2;
void OnTick () // Спец. функция start
  {
 // int M = TimeMinute(TimeCurrent());
//if(m1!=M)
 TimeServer();
//--------------------------------------------------------------------
  m1=m2;
   return ;                             // Выход из start()
  }
//--------------------------------------------------------------------
bool TimeServer()                                                  
{  
int M = TimeMinute( TimeCurrent ());
m2=M;
if (m1!=M)
   Alert (M, " - Tекущее время сервера" );
   Print (M, " - Tекущее время сервера" );
     if (( M >= 55 ) && (M <= 59 ))
   {
   return ( true );
   }
   else
   {
   return ( false );
   }
}
 
Valeriy Yastremskiy :

Anladım teşekkürler!

gerekliydi

 int M = TimeMinute( TimeCurrent ());

işlevin gövdesine koyun ve ondan önce değil, M değerini atayın

 
Denis Diakonov :

Anladım teşekkürler!

gerekliydi

işlevin gövdesine yerleştirin ve ondan önce değil, M değerini atayın

Farklı şekillerde mümkündür. Küresel ve yerel değişkenleri ve bunların görünürlüğünü okuyun.

 

Tünaydın. Açıdan trend çizgisinin açısını almaya çalışıyorum. İşte kod:

 void DrawLine( string name,
               datetime time1,
               double price1,
               datetime time2,
               double price2,
               double &angle)
  {
   CChartObjectTrendByAngle *line= new CChartObjectTrendByAngle();
   if (!line.Create( ChartID (),name, 0 ,time1,price1,time2,price2))
     {
       Print ( __FUNCTION__ + ": object line create failed. Last error: " , GetLastError ());
       delete line;
       return ;
     }
   
   line.Color(InpColorZoneUp);
   line.Background( false );
   line.RayLeft( false );
   line.RayRight( false );
   angle=line.Angle();
   
   /*ObjectCreate(name,OBJ_TRENDBYANGLE,0,time1,price1,time2,price2);
   double W = ObjectGet(name,OBJPROP_ANGLE);
   angle=W;*/
   lines.Add(line);
  }

açı her zaman 0'dır. Standart kitaplık yöntemleri mi yoksa yerleşik işlevler mi kullanılacağı. Bu durumda, çizgi çizilir. Sorun nedir? Bir açı nasıl elde edilir?

 
leonerd :

Tünaydın. Açıdan trend çizgisinin açısını almaya çalışıyorum. İşte kod:

açı her zaman 0'dır. Standart kitaplık yöntemleri mi yoksa yerleşik işlevler mi kullanılacağı. Bu durumda, çizgi çizilir. Sorun nedir? Bir açı nasıl elde edilir?

https://www.mql5.com/ru/forum/103591

Elbette, ama açıyı nasıl hesaplarsınız?

Вопрос: TRENDBYANGLE, а где ANGLE?
Вопрос: TRENDBYANGLE, а где ANGLE?
  • 2007.06.07
  • www.mql5.com
Добрый день...
 
leonerd :

https://www.mql5.com/ru/forum/103591

Elbette, ama açıyı nasıl hesaplarsınız?

Sen bir komedyensin.

Burada kimi çarmıha geriyorum?

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

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

Nikolai Semko , 2020.10.26 00:34

Neden hızdan korkuyorsun? Bu sadece tip döküm için bir kuraldır.
Açı algılama fonksiyonunun bir çeşidi olarak:

 struct PointPriceTime
  {
   double             price;
   datetime           time;
                     PointPriceTime( double p, datetime t) { price=p; time=t; };
   void               Set( double p, datetime t){ price=p; time=t;};
                     PointPriceTime(PointPriceTime &p){ price=p.price; time=p.time; };
                     PointPriceTime() { price= 0.0 ; time= 0 ; };
  };

double Angle(PointPriceTime &p1,PointPriceTime &p2) // возвращает угол в градусах в приведенной системе координат price-price, где по оси X 
  {                                                 // расстояние между x1 и  x2  = N*_Point, где N - количество минутных баров во временном промежутке отрезка. 
   static int tf[ 9 ]= { PERIOD_M1 , PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 , PERIOD_W1 , PERIOD_MN1 };
   int i= 0 ;
   while (i< 9 && SeriesInfoInteger ( _Symbol ,tf[i], SERIES_FIRSTDATE )>p1.time)
      i++;
   if (i== 9 )
     {
       Print ( "Время левой границы вне диапазона исторических данных" );
       return DBL_MAX ;
     }
   int bar1 = iBarShift ( _Symbol ,tf[i],p1.time);
   int bar2 = iBarShift ( _Symbol ,tf[i],p2.time);
   if (bar1==bar2)
       return 0.0 ;
   return atan ((p2.price-p1.price)/((bar1-bar2)* PeriodSeconds (tf[i])* _Point / 60 ))* 180 / M_PI ;
  }

MT5'ten sonra, MT4 ile çalışma hissi çok kötü. Tarihe erişim bir şekilde hadım ediliyor. Keneler konusunda bile sessizim.




 

Göstergede böyle bir yazı tipi seçimi yapılıp yapılamayacağını söyler misiniz?