MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 39
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Bunu nasıl açıklayacağımı bilmiyorum. Ama kesinlikle bir başyapıt.
Burada sokmayı sevdiklerini söylüyorum)) Ve Trishkin hala bundan rahatsız oldu .. Burada yardımcı olacakları bir kod olacağını söyledi ..
Ben de senin gibi acemiyim ama benim bile çok sorum var
for ( int i= 0 ; i< Sipariş Toplamı (); i++){
if ( OrderSelect (i, SELECT_BY_POS )== true )
{
if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Sihirli) devam ;
if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) p++;
if ( OrderType ()== OP_BUYSTOP )
if (bue_signal) OrderDelete ( OrderTicket ());
başka b++;
if ( OrderType ()== OP_SELLSTOP )
if (sell_signal) OrderDelete ( OrderTicket ());
başka s++;
}
}
1) b++'ı nereden buldun
2) s++ ı nereden aldınız
3) if (signal_bue) bu başka nedir?
ve kodun geri kalanı. Seni kırdıysam özür dilerim.
//| ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss = 100 ; //Стоплосс ордера
extern double TakeProfit = 150 ; //Тейкпрофит ордера
extern double TrailingStop = 100 ; // трал
extern int Delta = 100 ; //Расстояние от цены для установки ордера
extern double LOT = 0.1 ; //Объём позиции
extern int Magic = 2 ;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (TrailingStop!= 0 ) Trailing();
//ИНДИКАТОР RSI
double RSI0= iRSI ( NULL , 0 , 5 , PRICE_CLOSE , 0 );
double RSI1= iRSI ( NULL , 0 , 5 , PRICE_CLOSE , 1 );
int b = 0 , s = 0 , p = 0 , res = 0 ;
double BuyPrice= Ask +Delta* Point ;
double SellPrice= Bid -Delta* Point ;
for ( int i= 0 ; i< OrdersTotal (); i++)
{
if ( OrderSelect (i, SELECT_BY_POS )== true )
{
if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) p++;
if ( OrderType ()== OP_BUYSTOP )
{
if (RSI0< 50 &&RSI1> 50 )
OrderDelete ( OrderTicket ());
else
b++;
}
if ( OrderType ()== OP_SELLSTOP )
{
if (RSI0> 50 &&RSI1< 50 )
OrderDelete ( OrderTicket ());
else
s++;
}
}
}
double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить
//---- buy stop
if (RSI0> 50 &&RSI1< 50 && p< 1 && b< 1 ) // < !!!!!!!!!
{
res= OrderSend ( Symbol (), OP_BUYSTOP ,LOT,BuyPrice, 0 ,BuyPrice-StopLoss* Point ,BuyPrice+TakeProfit* Point , "ОТЛОЖКИ" ,Magic, OP_SELLSTOP ,Blue);
}
//---- sell stop
if (RSI0< 50 &&RSI1> 50 && p< 1 && s< 1 ) // < !!!!!!!!!
{
res= OrderSend ( Symbol (), OP_SELLSTOP ,LOT,SellPrice, 0 ,SellPrice+StopLoss* Point ,SellPrice-TakeProfit* Point , "ОТЛОЖКИ" ,Magic, OP_BUYSTOP ,Red);
}
//----
return ( 0 );
}
Burada sokmayı sevdiklerini söylüyorum)) Ve Trishkin hala bundan rahatsız oldu .. Burada yardımcı olacakları bir kod olacağını söyledi ..
Bu yüzden daha kolay:
{
for ( int i= 0 ; i< OrdersTotal (); i++)
{
if ( OrderSelect (i, SELECT_BY_POS )== true )
{
if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
if ( OrderType ()==Type)
OrderDelete ( OrderTicket ());
}
}
}
Bu, geçersiz OnTick() işlevinin dışında bir yerdedir.
if (сигнал_sell)OrderDelete_( OP_BUYSTOP );
Ve bu, void OnTick() işlevinin gövdesindedir.
Ve bu, void OnTick() işlevinin gövdesindedir.
TAMAM.
Elinden geleni yapmış gibi görünüyor. Açıklama yapıldı. Amaç, neden istediğiniz gibi çalışmadığını anlamaktır.
if () bloğunun içinde başka bir INSIDE var. Böyle mi olacaktı???
Daha ileri. Başlatılmamış genel değişken sayısı, yine işlevin kendisinde bildirilen Counts() işlevine iletilir.
Counts() işlevi siparişleri yeniden hesaplar, ancak bunları ana işlevde birkaç kez değişen bazı biletlerle karşılaştırır. Ancak, fonksiyonun tetiklendiği anda biletin değeri aynıdır. Peki fonksiyon kaç sipariş sayacak? Gerçekten birden fazla mı?
Bu formdaki bu fonksiyon argümanlara ihtiyaç duymaz, sadece çağırın ve sonucu döndürmesine izin verin.
Daha ileri. FindLastOType() işlevi yine bir biletle karşılaştırmadır. Doğru biletle karşılaştırılacağını garanti edebilir misiniz? Gerekli sihir ve sembole sahip ilk sipariş bulunduğunda döngüyü kırmak ve ardından sipariş türünü döndürmek daha kolay olmaz mıydı?
FindLastOrderOpenPrice() ve FindLastLot() ile aynı.
ModifyOrders() işlevi beni o kadar korkuttu ki geceleri kabus görmeden uyumak için uzun süre bakmadım...
Lütfen kodda düzeltmeler yapın
^_~ deneyin
extern double TakeProfit = 150 ; //Тейкпрофит ордера
extern double TrailingStop = 100 ; // трал
extern int Delta = 100 ; //Расстояние от цены для установки ордера
extern double LOT = 0.1 ; //Объём позиции
extern int Magic = 2 ;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
//--- create timer
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
//--- destroy timer
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()
{
int res = 0 ;
//ИНДИКАТОР RSI
double RSI0= iRSI ( NULL , 0 , 5 , PRICE_CLOSE , 0 );
double RSI1= iRSI ( NULL , 0 , 5 , PRICE_CLOSE , 1 );
double BuyPrice= Ask +Delta* Point ;
double SellPrice= Bid -Delta* Point ;
//---- buy stop
if (RSI0> 50 &&RSI1< 50 && Number( OP_BUYSTOP )< 0 && Number( OP_BUY )< 1 ) // < !!!!!!!!!
{
res= OrderSend ( Symbol (), OP_BUYSTOP ,LOT,BuyPrice, 0 ,BuyPrice-StopLoss* Point ,BuyPrice+TakeProfit* Point , "ОТЛОЖКИ" ,Magic, OP_SELLSTOP ,Blue);
}
//---- sell stop
if (RSI0< 50 &&RSI1> 50 && Number( OP_SELLSTOP )< 0 && Number( OP_SELL )< 1 ) // < !!!!!!!!!
{
res= OrderSend ( Symbol (), OP_SELLSTOP ,LOT,SellPrice, 0 ,SellPrice+StopLoss* Point ,SellPrice-TakeProfit* Point , "ОТЛОЖКИ" ,Magic, OP_BUYSTOP ,Red);
}
//----
if (RSI0> 50 &&RSI1< 50 ) OrderDelete_( OP_SELLSTOP );
if (RSI0< 50 &&RSI1> 50 )OrderDelete_( OP_BUYSTOP );
}
//+------------------------------------------------------------------+
void OrderDelete_( int Type)
{
bool r;
for ( int i= 0 ; i< OrdersTotal (); i++)
{
if ( OrderSelect (i, SELECT_BY_POS )== true )
{
if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
if ( OrderType ()==Type)
r = OrderDelete ( OrderTicket ());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number( int Type)
{
int kp= 0 ;
for ( int i= 0 ; i< OrdersTotal (); i++)
{
if ( OrderSelect (i, SELECT_BY_POS )== true )
{
if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
if ( OrderType ()==Type)
kp++;
}
}
return (kp);
}
//+------------------------------------------------------------------+
if () bloğunun içinde başka bir INSIDE var. Böyle mi olacaktı???
Daha ileri. Başlatılmamış genel değişken sayısı, yine işlevin kendisinde bildirilen Counts() işlevine iletilir.
Counts() işlevi siparişleri yeniden hesaplar, ancak bunları ana işlevde birkaç kez değişen bazı biletlerle karşılaştırır. Ancak, fonksiyonun tetiklendiği anda biletin değeri aynıdır. Peki fonksiyon kaç sipariş sayacak? Gerçekten birden fazla mı?
Bu formdaki bu fonksiyon argümanlara ihtiyaç duymaz, sadece çağırın ve sonucu döndürmesine izin verin.
Daha ileri. FindLastOType() işlevi yine bir biletle karşılaştırmadır. Doğru biletle karşılaştırılacağını garanti edebilir misiniz? Gerekli sihir ve sembole sahip ilk sipariş bulunduğunda döngüyü kırmak ve ardından sipariş türünü döndürmek daha kolay olmaz mıydı?
FindLastOrderOpenPrice() ve FindLastLot() ile aynı.
ModifyOrders() işlevi beni o kadar korkuttu ki geceleri kabus görmeden uyumak için uzun süre bakmadım...
düzelteceğim
başka bir yere koyamazsın, yanlış parametreler olacak
En güncel olanı dikkate almalı
değiştirmeye çalışacağım
İkincisine gelince, evet) Standart OrderModify() ile idare etmeye çalıştım, ancak bir grup sipariş sürekli ve aynı anda taşınırsa hesap yasaklandı
Eleştiri için teşekkürler.
Evet, bir braket ile kapatıldı. Sorunun geri kalanı alakalı.
bool condition;
if (condition) {}
eşdeğerdir
if (condition== true ) {}
ve
if (!condition) {}
eşdeğerdir
if (condition== false ) {}
Sadece daha kısa ve daha tanıdık.