[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 774

 
drknn :

Anlamadım piyasa emrinin açılışında böyle bir satır var bende ertelemeye kopyalayıp değişken ekliyorum bişey olmuyor yine aynı hata 4107 loga yazıp duruyorsa emir veriyor çok zor değil bak ne kaçırmışım

Dosyalar:
test_21_1.mq4  15 kb
 
FoxUA :

Anlamadım piyasa emrinin açılışında böyle bir satır var bende ertelemeye kopyalayıp değişken ekliyorum bişey olmuyor yine aynı hata 4107 loga yazıp duruyorsa emir veriyor çok zor değil bak ne kaçırmışım


Okunamayan bir kod organizasyonunuz var. Evet ve değişken adlarının bu tür kısaltmaları vardır ve bu da okunabilirliği zorlaştırır.

Kod bloklar halinde düzenlenmelidir. Değişkenlere, bir bakışta neyin tehlikede olduğu netleşecek şekilde isimler atayın. Sabitlerin adları (kendin için al) büyük harflerle yaz. Değerlerle sabitlerin başlatılması, başlatma bloğuna yerleştirilmelidir. Örneğin, hattı tamamen haksız yere kullandınız.

stringsy = Sembol();

EA'nın başında. Söyleyin bana, işlem aracının adı tüm işlem boyunca değişmiyorsa neden her işarette Symbol() işlevini çağırmanız gerekiyor? Başlatma bloğunda sy değişkeninin değerini 1 kez başlatmak yeterlidir ve bu kadar. Sonraki, işte kod bloğu

pral=StopLossLastPos(sy,OP_BUY,- 1 ) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,- 1 );  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,- 1 );   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,- 1 ) ; // цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

Temelde doğru değil! Son emrin stoploss'u bulmak için, o (sipariş) önce OrderSelect() kullanılarak seçilmelidir - aşağıdaki emir sayacındaki bir örneğe bakın. Bu, son siparişlerin durdurma seviyelerine ihtiyacınız varsa, bunu bir döngü aracılığıyla yapmanız gerektiği anlamına gelir. Takip etmek. Tasarım

 int total = OrdersTotal ();
if (total == 0 ){

}

haklı değil. OrdersTotal () işlevi, terminalde halihazırda açılmış olan toplam sipariş sayısını döndürür. Bu numara ayrıca diğer alım satım araçları için açılan emirleri ve özellikle danışman tarafından değil, bizzat sizin tarafınızdan, danışmanın atıldığı aynı enstrüman için manuel olarak açılan emirleri de içerecektir.

Ellerinizle ticaret yapmayacaksanız ve aynı zamanda ticaret sadece danışmanın atıldığı ticaret enstrümanında yapılacaksa, bu yapı işe yarayacaktır. Ancak, danışmanın manuel alım satımlarınıza müdahale etmemesi için paralel ve aynı anda el ticareti yapmak istediğinizde veya alım satımların diğer alım satım enstrümanlarında aynı şekilde ilerlemesini istediğinizde, bu tasarım sizi hayal kırıklığına uğratacaktır. Bu nedenle, her ticaret emri türü için ayrı emir sayaçları yazmak daha iyidir. İşte böyle bir sayaç örneği.

 //=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy( int MAGIC){
  string SMB= Symbol ();
  int SchBuy= 0 ;
  for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--) {
    if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )){
      Print ( "Ошибка № " , GetLastError (), " при выборе ордера № " ,i);
    }
    else {
      if ( OrderSymbol ()!= SMB || OrderMagicNumber ()!= MAGIC){ continue ;} // если не наш, то смотрим следующий
      if (OrderType()== OP_BUY ){ 
        SchBuy++;
      }  
    }
  }
  return (SchBuy);
}                  

Yukarıdaki önerileri dikkate alarak kodu yeniden yazın!!!

 

Üzgünüm, böyle satırları görmedim

pral=StopLossLastPos(sy,OP_BUY,- 1 ) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT

alt programı çağırın.

Ama yine de farklı şekilde organize etmek daha iyidir.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Bir ticaret enstrümanının sembolik adını alt programa aktarmaya gerek yoktur. Alt yordamınız bağlantı kitaplığında değil, EA'dadır. sy değişkeni Expert Advisor'ın global seviyesinde bildirildiği için bu değişken bu tür alt programların kapsamındadır. Ardından, alt yordama ikinci bir parametre iletirsiniz, ancak alt yordamın kendisini çağırdığınızda, bu parametreyi bir değerle başlatırsınız ( int op=-1) - bunu yapmanıza gerek yoktur. Aynı şey bir sonraki parametre için de geçerlidir.

Astar

>> if (op<0 || OrderType()==op) {

yine okunamaz. Bakın benim tezgahımda nasıl düzenleniyor!

 

Ve işte başka bir şey. kod bloğu

pral=StopLossLastPos(sy,OP_BUY,- 1 ) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,- 1 );  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,- 1 );   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,- 1 ) ; // цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

her tikte çağrılırsınız. Ancak her kene buna ihtiyaç duymaz. Stop/kâr emirlerini sadece bazı durumlarda bilmeniz gerekir. Burada bu durumlarda ayrıca bir alt program çağrısını da dahil etmeniz gerekir.

 
spidey :

Günün iyi zamanı, lütfen uyarıyı türkiye'ye sabitleyin (yukarıdan aşağıya yeşil çarpı kırmızı - sat, geri - satın al)

Yine, birileri forumda çalıntı kodlar yayınlıyor. :)))))))))

Herhangi birinin bu numaralandırılmış değişkenler karmaşasını ücretsiz olarak kazmak isteyeceğinden şüpheliyim :)

 
spidey :

Günün iyi zamanı, lütfen uyarıyı türkiye'ye sabitleyin (yukarıdan aşağıya yeşil çarpı kırmızı - sat, geri - satın al)

Tekrarlandığında, banyo için dilekçe vermek zorunda kalacağım.

Geri derlenmiş göstergeler göndermek, forum kurallarının ihlalidir.

 
kodu göndermem gerekiyor mu?
 
drknn :

Üzgünüm, böyle satırları görmedim

alt programı çağırın.

Ama yine de farklı şekilde organize etmek daha iyidir.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Bir ticaret enstrümanının sembolik adını alt programa aktarmaya gerek yoktur. Alt yordamınız bağlantı kitaplığında değil, EA'dadır. sy değişkeni Expert Advisor'ın global seviyesinde bildirildiği için bu değişken bu tür alt programların kapsamındadır. Ardından, alt yordama ikinci bir parametre iletirsiniz, ancak alt yordamın kendisini çağırdığınızda, bu parametreyi bir değerle başlatırsınız ( int op=-1) - bunu yapmanıza gerek yoktur. Aynı şey bir sonraki parametre için de geçerlidir.

Astar

>> if (op<0 || OrderType()==op) {

yine okunamaz. Bakın benim tezgahımda nasıl düzenleniyor!

Tobish, anladığım kadarıyla fonksiyon çağrısı basitçe yazılabilir.

PrAskLim = StopLossLastPos(OP_SELL) ; ve fonksiyonun kendisinde

double StopLossLastPos(int op=-1,) böyle değil mi?

evet, işlevleri bu siteden aldığımı söyledim, robotları kontrol edildi, bu nedenle içlerindeki değişkenleri daha okunaklı olanlara değiştirmeye cesaret edemiyorum, çünkü belki de neyin mümkün olduğu ve neyin mümkün olduğu konusunda hala yeterli deneyim yok. değil, bu, çalışma işlevinde değiştiremeyeceğim gerçeğiyle dolu ve her şey yine bir kod yığınında bir iğne arıyor,

ama zaten kendim eklediğimi olabildiğince düzelttim,

ancak bu, her şeyin 4107'nin de yazıldığı günlükle ilgili sorunu çözmedi ve burada soru, fiyatı nasıl narmolize edebilirim ve durur, çünkü bekleyen emirleri ayarlama işlevinin kendisi çalışıyordu ve hiçbir şeyi büyük ölçüde değiştirmedim içinde.

ikinci soru ise bu fiyata spreadin nasıl ekleneceğidir PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD); )

Danışmanın düzeltilmiş bir versiyonunu gönderiyorum

Dosyalar:
test_21_2.mq4  16 kb
 
spidey :
kodu göndermem gerekiyor mu?
Çalıntı malları vermeyin.
 
drknn :
Çalıntı malları vermeyin.

Çalmak zorunda değilsin.

Ancak bu kaynağın kuralları yasak değil ...

https://www.mql5.com/en/code/8089

;)