Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 767

 
tuner :

Cevabı hemen görmedim. Dürüst olmak gerekirse, bunda bir karışıklık olmadığını savunarak ne demek istediğinizi tam olarak anlamadım.

Yani, " StringToTime() işlevinin geçen saniyeleri ne kadar süre saydığı önemli değil" nasıl olur?

İşlev, aslında, genel olarak sol tarihi alır (yerel bilgisayarın tarihinin soldaki tarih olduğuna inanıyorum) ve aracı sunucusunun geçerli saatini onunla karşılaştırır, bu neden önemli olmasın?

Yukarıdaki ekran görüntüsünden yorum, yerel bilgisayarınızdaki zamanın komisyoncu saatinden 1 saat ileri olduğunu, yani GMT kaymasının daha büyük olduğunu söylüyor. X saat daha az olsaydı, Cuma hakkında yazdığım durumda olduğu gibi kritik olurdu.

Ve işlem süresinin sonu hakkında. Sanırım komisyoncu işlem gününü veya haftasını bitirdiğinde StringToTime() işlevi için önemli olmamalı...

Başka bir açıklamam yok.

Şimdi Moskova'da saat 11:40 ise, 01/01/1970 tarihinden şimdiki zamana XXX saniye geçmiştir.

Örneğin Londra'da saat 11:40 olduğunda, o zaman saniye sayısı şimdi Moskova'dakiyle aynı olacaktır ... Sadece çünkü 01/01/1970 Londra'da şu anki saat ne kadar farklıysa o kadar geç olmuştur. Karşılaştırma, belirtilen süre değil, yalnızca geçen saniye sayısıdır.

01/01/1970 00:00:00 tarihinden itibaren saniye sayısını hesaplamak için formülü yazmaya çalışın.

Kısa bir süre için böyle bir formül olacaktır. İçinde bulunulan ayın başından itibaren 6*24*60*60 + 11*60*60 + 59*60 + baktığınız saatin saniyenin o anki değeri geçmiştir.

 

Karşılaştırmanın 70. yıldan bu yana geçen saniye sayısına dayandığı açıktır, ancak bu saniye sayısında her şey - hem tarih hem de saat - dikkate alınır.

Sadece bir örnek vereceğim, aslında son zamanlarda yaşadığım bir problemin basitleştirilmesi.

Görev: Cuma geldiğinde, "21:30" dize değişkenini hesaba katarak, bu günkü ticaretin bitiş saatini (tarih saatini) hesaplayın.

Orijinal çözümüm şuydu:

 datetime EndTrading;

if (TimeDayOfWeek( TimeCurrent ())== 5 )     // если сейчас пятница, например возьмем сегодняшний день, первый тик 2014.11.07 00:00
  EndTrading= StringToTime ( "21:30" );     // подразумевается что тут должно быть время пятницы...

if (TimeDayOfWeek( TimeCurrent ())== 5 )     // если настала пятница
   if ( TimeCurrent ()>EndTrading)           // и время удовлетворяет условию
     Print ( "Настала пятница и текущее время больше чем 21:30" );

Ve şimdi bir şaka: kodda belirtilen baskı Cuma günü açılır, ancak 21:30'dan sonra değil, ilk tikte 00:00'da.

Çünkü aracının sunucusunda Cuma olduğu zaman, yerel bilgisayarımda zaman kayması farklı olduğu için hala Perşembe günüydü.

Test cihazında her şey yoluna girecek ve baskı olması gerektiği gibi Cuma günü 21:30'dan sonra açılacak. Peki, bu bir karışıklık değil mi?

 
tuner :

Karşılaştırmanın 70. yıldan bu yana geçen saniye sayısına dayandığı açıktır, ancak bu saniye sayısında her şey - hem tarih hem de saat - dikkate alınır.

Sadece bir örnek vereceğim, aslında son zamanlarda yaşadığım bir problemin basitleştirilmiş hali.

Görev: Cuma geldiğinde, "21:30" dize değişkenini hesaba katarak, bu günkü ticaretin bitiş saatini (tarih saatini) hesaplayın.

Orijinal çözümüm şuydu:

Ve şimdi bir şaka: kodda belirtilen baskı Cuma günü açılır, ancak 21:30'dan sonra değil, ilk tikte 00:00'da.

Çünkü aracının sunucusunda Cuma olduğu zaman, yerel bilgisayarımda zaman kayması farklı olduğu için hala Perşembe günüydü.

Test cihazında her şey yoluna girecek ve baskı olması gerektiği gibi Cuma günü 21:30'dan sonra açılacak. Peki, bu bir karışıklık değil mi?

Kesinlikle kafa karışıklığı. Sadece kafa karışıklığı. TimeToString ("21:30"), ertesi gün 21:30:00 ile 21:29:59 arasında geçerli tarihi verir. Kodunuzdaki yorumları düzelteceğim.

 datetime EndTrading;

if (TimeDayOfWeek( TimeCurrent ())== 5 )     // если сейчас пятница, от текущего времени. Наступит когда по времени сервера будет 00:00
  EndTrading= StringToTime ( "21:30" );     // А тут в 00:00 устанавливается четверг 21:30 потому, что это время пятницы ещё далеко.

if (TimeDayOfWeek( TimeCurrent ())== 5 )     // если настала пятница
   if ( TimeCurrent ()>EndTrading)           // А тут условие если (текущее время больше чем четверг 21:30)
   {
     Print ( " EndTrading = ", TimeToString ( EndTrading ) ); // Посмотри что будет напечатано.
   }


Ve bu kod düzgün çalışacak

 if (TimeDayOfWeek( TimeCurrent ()) == 5 && TimeCurrent () >= StringToTime ( "21:30" ))
Print ( "Настала пятница и текущее время больше чем 21:30" );
 
ikatsko :
Bir dizüstü bilgisayar iki MT4 terminaline sahiptir: biri 4 ondalık basamaklı, ikincisi 5 ondalık basamaklı. Aynı zamanda ilk 105/0 kb'de trafik, ikinci 3450/0 kb'de. Birincisi işlemciyi %6, ikincisi - %39 oranında çökertiyor. Sorun nedir? Bu genellikle norm mu?
Evet.
 

AlexeyVik

Bilgisayarımdaki tarihi 2000 olarak değiştirdim.

bu betiği çalıştırdı:

 input string time= "21:30" ;

Comment ( "TimeCurrent() = " , TimeCurrent (), "\n" ,
"TimeLocal() = " , TimeLocal (), "\n" ,
"StringToTime(" ,time, ") = " , StringToTime (time));

ve alınan:

dolayısıyla StringToTime() işlevi yerel bilgisayardan tarihi alır

 
tuner :

AlexeyVik

Bilgisayarımdaki tarihi 2000 olarak değiştirdim.

bu betiği çalıştırdı:

ve alınan:

dolayısıyla StringToTime() işlevi yerel bilgisayardan tarihi alır

Ne olmuş??? En azından aydan almasına izin verin, bu seferki ana şey XXX saniyenin "den ve sonuna" geçti ve ortaya çıkan bu tam sayı, ihtiyacımız olan 01/01/1970'den geçen ihtiyacımız olan saniye sayısıyla karşılaştırıldı. .

Bu satırı kontrol etsen iyi olur

 if (TimeDayOfWeek( TimeCurrent ()) == 5 && TimeCurrent () >= StringToTime ( "21:30" ))

sorunu nerede yaşadınız. Bugün Cuma gibi.

 
AlexeyVik :

Bu satırı kontrol etsen iyi olur

sorunu nerede yaşadınız. Bugün Cuma gibi.

Yerel bilgisayardaki tarihin komisyoncu tarihinden küçük olup olmadığını kontrol ettim, sonra baskılar var,

ve yerel bilgisayardaki tarih, aracının tarihinden büyükse, baskı olmaz

tam olarak geçen zamanı kontrol ederken, yani "11:30"

ilk durumda, TimeCurrent() 2014.11 ile karşılaştırılır. 06 11:30 ve ikinci durumda 2014.11. 08 11:30

PS vurgulananları düzeltti

 if (TimeDayOfWeek( TimeCurrent ())== 5 )       // если сейчас пятница, от текущего времени. Наступит когда по времени сервера будет 00:00
   EndTrading= StringToTime ( "21:30" );     // А тут в 00:00 устанавливается четверг 21:30 потому, что это время пятницы ещё далеко.

ilk satır net, ikinci satırdaki yorum net değil.

Cuma zaten gelmişken neden çok uzakta? Sonuçta, ikinci satır yalnızca Cuma ise yürütülür.

 
tuner :

Yerel bilgisayardaki tarihin komisyoncu tarihinden küçük olup olmadığını kontrol ettim, sonra baskılar var,

ve yerel bilgisayardaki tarih, aracının tarihinden büyükse, baskı olmaz

aynı zamanda tam olarak geçmiş olan saate, yani "11:30"a baktım.

ilk durumda, TimeCurrent() 2014.11 ile karşılaştırılır. 06 11:30 ve ikinci durumda 2014.11. 08 11:30

PS seçimi düzeltti


Benim yerel saatim sunucu saatinden 1 saat daha uzun.

Bu komut dosyası

   datetime time_begin;
    time_begin = StringToTime ( "21:30" );
     Comment ( "Текущее локальное время " , TimeLocal (), " " , TimeToString ( TimeLocal (), TIME_DATE | TIME_SECONDS ), "\n"
          , "Текущее время сервера    " , TimeCurrent (), " " , TimeToString ( TimeCurrent (), TIME_DATE | TIME_SECONDS ), "\n"
          , "Сегодня 21:30 по TimeLocal будет через    " , time_begin- TimeLocal (), " секунд или " , 
           TimeToString (time_begin- TimeLocal (), TIME_MINUTES | TIME_SECONDS ), "\n"
          , "Сегодня 21:30 по TimeCurrent будет через " , time_begin- TimeCurrent (), " секунд или " , 
           TimeToString (time_begin- TimeCurrent (), TIME_MINUTES | TIME_SECONDS ), "\n"
          );


bunun gibi değerler verir

İlk olarak 01/01/1970 tarihinden belirtilen süreye kadar geçen saniye sayısı ve ardından alıştığımız formdaki süre.


Buna dayanarak, bu değerlerde kafanızı karıştıran şeyi açıklayın?


Evet. İkinci yorumumda, bunun hakkında gerçekten düşünmedim.

 
TheXpe
TheXpert :
Evet.
Teşekkür ederim. Öz olmak ince zekanın ruhudur!
 

Merhaba.

Böyle bir görev var. (tike vidalayamam)

Bekleyen bir sipariş tetiklenirse {o zaman...}

Siparişleri saymak için EA'da Terminal.mqh kullanıyorum.

Terminal // Mas_Tip[0] Satın Al'ı aç

// Buy emirlerinin sayısı 1 artarsa...

if (Mas_Tip[0]+1)

{

işlev

}

Her şey çalışıyor. Ama sonraki her kene üzerinde çalışır.

Bu davayı işaretlemek için nasıl eklenir? Ardından, önceki tik ve mevcut tik üzerindeki değeri karşılaştırın.