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

 
Vitalie Postolache :
tamam taklit etmene gerek yok
neden mql4 değil
 
Vitalie Postolache :

Bu şekilde biraz çalışmıyor. Bu işlevin bağımsız değişkenleri olarak belirtilir 1) içinde aranacak dize; 2) bulunacak karakterlerin kombinasyonu; 3) Arama başlangıcı (varsayılan olarak - madde 1'e göre dizenin boş karakterinden).

Aranan alt dizenin başladığı dizedeki konum numarasını veya alt dize bulunamazsa -1 döndürür.

Yani, şöyle yazmanız gerekir:

if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 ) {действие при нахождении признака закрытия по TP}

cevap için teşekkürler ... işte bu, parametreleriyle birlikte StringFind işlevi ortaya çıkıyor ( string string_value, string match_substring, int start_pos = 0 ) ortak kodda bir satırda yazılır

fonksiyon parametrelerinin verilerine karşılık gelen argümanlar: sicim SiparişYorumu () , dize "[tp]" , int 0 ve bu ifade ( parantez içine alınmış) -1'den büyükse, aşağıdaki { küme parantezleri içine alınmış r } kodu yürütülür:

if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 )

{

çift OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Sipariş No",OrderTicket()," kar: ", OrderTakeProfit());

başka

Print("OrderSelect() bir hata döndürdü - ",GetLastError());

bool PlaySound(

string ödeme // burada " ödeme", Sound MT4 klasöründeki dosyanın adıdır

);

}

... bu tür kodlar MQL4'te çalışacak mı? ...

 
bablusut :

cevap için teşekkürler ... işte bu, parametreleriyle birlikte StringFind işlevi ortaya çıkıyor ( string string_value, string match_substring, int start_pos = 0 ) ortak kodda bir satırda yazılır

fonksiyon parametrelerinin verilerine karşılık gelen argümanlar: sicim SiparişYorumu () , dize "[tp]" , int 0 ve bu ifade ( parantez içine alınmış) -1'den büyükse, aşağıdaki { küme parantezleri içine alınmış r } kodu yürütülür:

if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 )

{

çift OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Sipariş No",OrderTicket()," kar: ", OrderTakeProfit());

başka

Print("OrderSelect() bir hata döndürdü - ",GetLastError());

bool PlaySound(

string ödeme // burada " ödeme", Sound MT4 klasöründeki dosyanın adıdır

);

}

... bu tür kodlar MQL4'te çalışacak mı? ...

çift OrderTakeProfit(); - Burada fikir üzerine yemin etmek derlemede olmalıdır.

Anladığım kadarıyla, (hala kendim çözüyorum) - OrderTakeProfit(); siteden kar emri talebi yapar. Bu nedenle, bu birkaç satırda EA, OrderTakeProfit(); Görünüşe göre bu satırın kaldırılması gerekiyor ( double OrderTakeProfit(); )

 
bablusut :

cevap için teşekkürler ... işte bu, parametreleriyle birlikte StringFind işlevi ortaya çıkıyor ( string string_value, string match_substring, int start_pos = 0 ) ortak kodda bir satırda yazılır

fonksiyon parametrelerinin verilerine karşılık gelen argümanlar: sicim SiparişYorumu () , dize "[tp]" , int 0 ve bu ifade ( parantez içine alınmış) -1'den büyükse, aşağıdaki { küme parantezleri içine alınmış r } kodu yürütülür:

if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 )

{

çift OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Sipariş No",OrderTicket()," kar: ", OrderTakeProfit());

başka

Print("OrderSelect() bir hata döndürdü - ",GetLastError());

bool PlaySound(

string ödeme // burada " ödeme", Sound MT4 klasöründeki dosyanın adıdır

);

}

... böyle bir kod MQL4'te çalışacak mı? ...

Bunun hakkında zaten söylediler: double OrderTakeProfit() - bunu yapma. Bu fonksiyon bir otomat tarafından bildirilir ve tekrar bildirilemez ve derleyici hata verecektir, standart fonksiyonların önceden bildirilmesine gerek yoktur.

if(OrderSelect(12, SELECT_BY_POS)==true) - bunu yaparsanız, en iyi ihtimalle, yukarıda yorumun işlendiği sipariş değil, başka bir sipariş olacaktır. Sıra zaten en baştan seçilmiş olmalıdır, if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 ) öncesinde ve sipariş numarasının bir argümanı olarak döngü sayacını değiştirmeniz gerekir, değil bir sabit, aksi takdirde her izle yineleme 12. sıra olacaktır.

 
Vitalie Postolache :

Bunun hakkında zaten söylediler: double OrderTakeProfit() - bunu yapma. Bu fonksiyon bir otomat tarafından bildirilir ve tekrar bildirilemez ve derleyici hata verecektir, standart fonksiyonların önceden bildirilmesine gerek yoktur.

if(OrderSelect(12, SELECT_BY_POS)==true) - bunu yaparsanız, en iyi ihtimalle, yukarıda yorumun işlendiği sipariş değil, başka bir sipariş olacaktır. Sıra, if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 ) öncesinde en baştan seçilmiş olmalıdır.

A1exPit :

çift OrderTakeProfit(); - Burada fikir üzerine yemin etmek derlemede olmalıdır.

Anladığım kadarıyla, (hala kendim çözüyorum) - OrderTakeProfit(); platformdan kar emri talebi yapar. Bu nedenle, bu birkaç satırda EA, OrderTakeProfit(); Görünüşe göre bu satırın kaldırılması gerekiyor ( double OrderTakeProfit(); )

Yorum için teşekkürler - haklıydın.
 
"Vitalie Postolache :

Bunun hakkında zaten söylediler: double OrderTakeProfit() - bunu yapma. Bu fonksiyon bir otomat tarafından bildirilir ve tekrar bildirilemez ve derleyici hata verecektir, standart fonksiyonların önceden bildirilmesine gerek yoktur.

if(OrderSelect(12, SELECT_BY_POS)==true) - bunu yaparsanız, en iyi ihtimalle, yukarıda yorumun işlendiği sipariş değil, başka bir sipariş olacaktır. Sıra zaten en baştan seçilmiş olmalıdır, if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 ) öncesinde ve sipariş numarasının bir argümanı olarak döngü sayacını değiştirmeniz gerekir, değil bir sabit, aksi takdirde her izle yineleme 12. sıra olacaktır.

Cevabınız için teşekkürler ... double OrderTakeProfit() işlevinin bildirilmesiyle, açık, onu siliyoruz.

"... sipariş numarasının bir argümanı olarak, döngü sayacını değiştirmeniz gerekir" - önceki kodda, OrdersHistoryTotal işlevinde yalnızca bir döngü sayacımız var, gövdeli for döngüsü operatörü (i=0;i <accTotal;i++), bu nedenle operatörün gövdesi, OrderSelect işlevinin gövdesiyle değiştirilmelidir ve şunu elde ederiz:

  if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 )

{

if(OrderSelect (i=0;i<accTotal;i++) ==true)

Print("Sipariş No",OrderTicket()," kar: ", OrderTakeProfit());

başka

Print("OrderSelect() bir hata döndürdü - ",GetLastError());

bool PlaySound(

string ödeme // burada " ödeme", Sound MT4 klasöründeki dosyanın adıdır

);

}

... böyle bir kod MQL4'te çalışacak mı? ...




 
bablusut :

Cevabınız için teşekkürler ... double OrderTakeProfit() işlevinin bildirilmesiyle, açık, onu siliyoruz.

"... sipariş numarasının bir argümanı olarak, döngü sayacını değiştirmeniz gerekir" - önceki kodda, OrdersHistoryTotal işlevinde yalnızca bir döngü sayacımız var, gövdeli for döngüsü operatörü (i=0;i <accTotal;i++), bu nedenle operatörün gövdesi, OrderSelect işlevinin gövdesiyle değiştirilmelidir ve şunu elde ederiz:

Tekrar. Bir siparişle çalışırken, OrderSelect ilk sırada olmalıdır. Sonra diğer her şey.

Siparişler arasında bir sıralama döngüsünde çalışırsak, prosedür aşağıdaki gibidir:

1. Kontrol edin (OrderSelect())

2. Bunun bir emir olup olmadığını kontrol ederler, genellikle sembolü ve sihri kontrol ederler, sonra gerekirse türü kontrol ederler - if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) - bu durumda sadece piyasa sembolleri, mevcut enstrümana ve belirtilen sihirle verilen siparişler işlenir.

3. OrderComment(), OrderProfit() vb. gibi diğer verileri işlemek.

Bunun gibi bir şey görünecek:

for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--) //перебираем историю торгов
{
       if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) //если ордер выбран то работаем дальше, иначе смысла нет
      {
         if ( OrderSymbol ()== _Symbol && OrderMagicNumber ()==Magic && OrderType ()< 2 ) //Если ордер тот, что нам нужен (эту проверку можно и опустить, если нужно обработать все ордера в истории)
         {
             if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 ) //если найден признак закрытия профитом
             Print ( "Order #" , OrderTicket (), " profit: " , OrderTakeProfit ());
             if ( StringFind ( OrderComment (), "[sl]" , 0 )>- 1 ) //если найден признак закрытия стоплосс
             Print ( "Order #" , OrderTicket (), " loss: "OrderTakeProfit ());
         }
      }
}
 
birine konuyu anlatın: iCustom göstergesinin belirli bir arabelleğinde bir sinyal değerinin varlığı nasıl kontrol edilir?
 
Vitalie Postolache :
Tekrar. Bir siparişle çalışırken, OrderSelect ilk sırada olmalıdır. Sonra diğer her şey.

deneme yanılma yoluyla karar verdiler, görünüşe göre, akım pahalıya mal olacak, kendisi bunu yaşadı ...

Dürüst olmak gerekirse kulaklarım çınlıyor...

 
atik441 :
birine konuyu anlatın: iCustom göstergesinin belirli bir arabelleğinde bir sinyal değerinin varlığı nasıl kontrol edilir?
Bağlantıyı takip edin, gönderinizde vurgulanmıştır.