Hatalar, hatalar, sorular - sayfa 2452

 
A100 :

Ve öyle ki diziler a = b kurallarına göre değil, ArrayCopy ( a, b ) kurallarına göre kopyalanır.

Kendin mi buldun yoksa bir yerde mi yazıyor?
Dinamik dizili yapılar için örtük bir atama operatörünün çalışmasından bahsettiğimizi hatırlatmama izin verin.

 
Sergey Dzyublik :

Kendin mi buldun yoksa bir yerde mi yazıyor?
Dinamik dizili yapılar için örtük bir atama operatörünün çalışmasından bahsettiğimizi hatırlatmama izin verin.

Bu benim fikrim değil, geliştiriciler

         uchar a[], b[]; a = b; //Error: invalid array access
Neden hata? Yapıya sarıldı ve hata kayboldu mu? Ve neden? Temelde ne değişti? cevaplarım yukarıda
 
Alexey Viktorov :

Soru yalnızca eylem ve olaylar dizisinin organizasyonundadır.

Sıralamanın garanti edilmediği söylenen kılavuzdan kendiniz alıntı yaptınız. Bu yüzden riskli.

Vladimir'in tavsiyesi üzerine kodu yeniden yazmaya başladım, ancak kapatmanın bir onay işaretinden daha uzun sürdüğü durumda tökezledim - yine çift sayım (sayımdaki filtre düğümünün çok ağır olduğu ortaya çıktı). Şimdiye kadar, optimizasyon hızıyla bir uzlaşma uğruna tamamen kapanana kadar durmaktan daha iyi bir şey bulamadım.

Bugün Cuma :) Belki dinlendikten sonra bir şeyler bulurum.

Her durumda, fikirler için teşekkürler - boşa gitmeyecekler!

 
A100 :

Bu benim fikrim değil, geliştiriciler

Nerde yazdığını anlamadım ama önemli değil...
Soğutucu için teşekkürler.

Beni bir koltuk değneğiyle desteklediler ve koştular:

 struct MyArray{
   uchar data[];
   
   void operator =(MyArray &bytes){
       ArrayCopy ( this .data, bytes.data);
       ArrayResize ( this .data, ArraySize (bytes.data));
   }
};


MyArray GetArray( int i){
   MyArray arr;
   
   if (i% 2 == 0 ){
       ArrayResize (arr.data, 8);
       ArrayInitialize (arr.data, 0x8 );
   } else {
       ArrayResize (arr.data, 4 );
       ArrayInitialize (arr.data, 0x4 );
   }
   return arr;
}


void OnStart (){
   MyArray arr_1 = GetArray( 1 );
   ArrayPrint (arr_1.data);        // 4 4 4 4
   
   MyArray arr_2 = GetArray( 2 );
   ArrayPrint (arr_2.data);        // 8 8 8 8 8 8 8 8
   
   arr_2 = arr_1;
   ArrayPrint (arr_2.data);        // 4 4 4 4            
}
 
Igor Zakharov :

Sıralamanın garanti edilmediği söylenen kılavuzdan kendiniz alıntı yaptınız. Bu yüzden riskli.

Vladimir'in tavsiyesi üzerine kodu yeniden yazmaya başladım, ancak kapatmanın bir onay işaretinden daha uzun sürdüğü durumda tökezledim - yine çift sayım (sayımdaki filtre düğümünün çok ağır olduğu ortaya çıktı). Şimdiye kadar, optimizasyon hızıyla bir uzlaşma uğruna tamamen kapanana kadar durmaktan daha iyi bir şey bulamadım.

Bugün Cuma :) Belki dinlendikten sonra bir şeyler bulurum.

Her durumda, fikirler için teşekkürler - boşa gitmeyecekler!

Ben kendi tutarlılığımdan bahsediyordum.

Gözlemlerime göre, OnTick'ten sonra, bir işlem gerçekleştiğinde, bir sonraki tick'i beklemeden kod yürütmenin OnTradeTransaction işlevine aktarıldığı ortaya çıkıyor. Bu nedenle, kendi işlevleriyle veya OnTradeTransaction'da kapatma gerçeğini ele almak arasında hiçbir fark yoktur . Ama OnTradeTransaction ile çalışmayı daha çok seviyorum. Ana şey, sunucudan gelen işlem sırasına bağlı kalmadan işlem sırasını doğru bir şekilde düzenlemektir. Ve bu sırayı doğru anlamak önemlidir . Yine gözlemlerime göre işlem türünde sıra ihlal edilebilir. Yani önce TRADE_TRANSACTION_DEAL_ADD ve ardından TRADE_TRANSACTION_HISTORY_ADD olabilir ve mantığa göre önce siparişin geçmişe sonra anlaşmaya eklenmesi gerekiyor gibi görünüyor.

not; Ardından dediğim gibi TRADE_TRANSACTION_DEAL_ADD işlemini filtre ettikten sonra pozisyon açma ve pozisyon kapatma işlemlerini filtreleyebilirsiniz. Sonuçta bir forex piyasası danışmanından ve bir hadge hesabından bahsediyoruz değil mi? Buna göre, her hapşırma ile tüm pozisyonları yeniden hesaplamaya gerek yoktur. Bir açılış varsa bir tane eklemek, bir kapanış varsa sayılandan bir tane çıkarmak yeterlidir.
 
Alexey Viktorov :

forex piyasası ve hadge hesabı değil mi?

Izgara :) Evet.

Şu anki mantık şu: Her grid için tüm bilgileri saklayan bir yapı var: sembol-pozisyon sayısı-toplam lot-kâr ve bu konuşma için önemli olmayan birkaç şey daha... sipariş varsa zamanlayıcı (çok sembollü robot). Ancak lotlar ve miktarlar OnTradeTransaction'da yeniden hesaplandı (kullanıcının "yardım etmesi" durumunda).

Örneğin, bir ızgara artı 100 dolar ve diğeri eksi 50 dolar olduğunda durumu kontrol etmek istedim - büyümesine izin vermemek için her ikisini de 50 karla kapatın.

Şu anda bu şekilde yapılır:

 void    OnTradeTransaction (
   const MqlTradeTransaction &    trans,     // trade transaction structure 
   const MqlTradeRequest &        reqst,     // request structure 
   const MqlTradeResult &         reslt       // response structure 
    )
{
 int index=- 1 ;
 for (index= 0 ;index<symbols_total;index++)
   if (ARRAY[index].symbol==trans.symbol) break ; //нашли индекс символа по которому прошла трансакция в массиве структур
 
 if (index>= 0 ) CountOrders(index); //пересчитали элемент
}

Şimdiye kadar birkaç ızgarayı kapattıktan sonra CountOrders() eklendi. Test cihazı için - işe yarıyor. Gerçekte, bunu Vladimir'in planına göre yapacağım (bir dizi kapalı biletle)

Bu arada, çifte kapanma kendini haklı çıkarmadı - düşüş büyük ölçüde azalmaz, ancak kâr düzgün bir şekilde düşer.

 
Vladimir Karputov :

Pozisyon kapatma görevi için TÜM, Uyku ve OnTimer'ı hendek yapardım. Bunu yapardım: kapatmak için ateş emri - OnTick'ten çıkın, bir sonraki onay kontrolünde: gerekli biletlerin bulunduğu pozisyonlar hala hayattaysa - onTick'teki giriş / çıkış boyunca bir daire içinde tekrar kapatmak için ateş emirleri vb.

Mantık şu şekildedir: bir pozisyonu kapatmak en önemli önceliktir, bu nedenle kapanış döngüsü OnTick'in en başındadır. Ve bir dizi kapanış biletinin oluşumu OnTick'in herhangi bir yerinde olabilir - en azından en sonunda.

Ve er ya da geç aşağıdakileri alacaksınız: pozisyonu kapatmanız, kapatmak için bir emir göndermeniz (MQL5), yani. karşıt türde bir emir gönderdi, çünkü ilgili işleyicideki alım satım işlemlerini takip etmiyorsunuz (veya pozisyonun durumunu danışmana kaydetmezsiniz), bir sonraki onay işaretinde, yakın bir emir gönderilme sürecinde olabilir , ve başka bir sipariş veriyorsunuz. Sonuç, ters yönde bir konumdur.

 
Alexey Kozitsyn :

Ve er ya da geç aşağıdakileri alacaksınız: pozisyonu kapatmanız, kapatmak için bir emir göndermeniz (MQL5), yani. karşıt türde bir emir gönderdi, çünkü ilgili işleyicideki alım satım işlemlerini takip etmiyorsunuz (veya pozisyonun durumunu danışmana kaydetmezsiniz), bir sonraki onay işaretinde, yakın bir emir gönderilme sürecinde olabilir , ve başka bir sipariş veriyorsunuz. Sonuç, ters yönde bir konumdur.

Böyle bir durum için var:

10036

TRADE_RETCODE_POSITION_CLOSED

Belirtilen POSITION_IDENTIFIER ile pozisyon zaten kapatıldı

Kapanış pozisyonu, bilet kapatılarak gönderilir, bu nedenle tarif ettiğiniz şeyin gerçekleşmesi olası değildir.

 
Sergey Dzyublik :

Nerde yazdığını anlamadım ama önemli değil...
Soğutucu için teşekkürler.

Beni bir koltuk değneğiyle desteklediler ve koştular:

Eh, genel olarak, diziler garip bir şekilde kopyalanır, ancak birileri bundan hoşlanır bile ...

Kendimi dizi üzerinde az çok yeterli bir sarmalayıcı yaptım ve sorunları bilmiyorum.

https://www.mql5.com/ru/forum/221917/page26#comment_11233214

 
A100 :

Bu benim fikrim değil, geliştiriciler

Hiç öyle dediklerini hatırlamıyorum.

Atama operatörü , bir nesnenin özdeş bir kopyasını oluşturmak için tasarlanmıştır. Bu onun anlamıdır. Bir şeyi bir şeyle eşitlediğinizde, açıkçası sol tarafta tam bir kopya almalısınız, ne olduğu değil. Yani bu açıkça bir bug.