![MQL5 - MetaTrader 5 müşteri terminalinde yerleşik ticaret stratejileri dili](https://c.mql5.com/i/registerlandings/logo-2.png)
Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret 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
Sevgili kodlayıcılar,
EA'ma "günde dört işlem / Kâr Hedefine ulaşılırsa ticareti durdur" özelliğini uygulamak istiyorum.
Maksimum ticaret limitine / kârına ulaşılırsa, EA ticarete devam etmek için bir sonraki güne kadar beklemelidir.
Acaba birisi kodumu gözden geçirebilir mi, burada biraz "beyin donması" var, bu yüzden kod
bir tür sözde kod durumudur... ;-)
Şimdiden teşekkür ederim!
extern int MaxShortTrades = 2 ;
extern int MaxLongTrades = 2 ;
extern double profitTarget = 300; // Target in Money
// Count Trades per Day.
int y;
int totalOrders = 4;
datetime toT; // Time of Trade
datetime doT; // Day of Trade
datetime now = TimeCurrent ();
datetime boD=now-now% 86400 ; // Beginning of day
if (AccountProfit()>= profitTarget)
{
for (y= 0 ;y<totalOrders; y++)
{
if ( OrderSelect (y, SELECT_BY_POS , MODE_HISTORY ))
{
toT= OrderOpenTime (); // Time of Trade
doT=toT-toT% 86400 ; // Day of Trade.
if (doT==boD)
{ // Time of Trade within Current Day.
for (j= OrdersTotal ()- 1 ;j>= 0 ; j--)
{
if ( OrderType ()== OP_BUY ) totalOrders++; // Check # of long trades.
if ( OrderType ()== OP_SELL ) totalOrders++; // Check # of short trades
}
}
}
}
}
if (totalOrders<MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if (totalOrders<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
Hem geçmişi (günümüzde kapanan siparişler için) hem de açılan siparişleri kontrol etmek için şunu deneyin:
int totalOrdersLong = 0 , totalOrdersShort = 0 ;
for ( int y= OrdersHistoryTotal ()- 1 ;y>= 0 ; y--)
{
if ( OrderSelect (y, SELECT_BY_POS , MODE_HISTORY ))
if ( OrderCloseTime ()>=today)
{
if ( OrderType ()== OP_BUY ) totalOrdersLong++;
if ( OrderType ()== OP_SELL ) totalOrdersShort++;
}
}
for ( int y= OrdersTotal ()- 1 ;y>= 0 ; y--)
{
if ( OrderSelect (y, SELECT_BY_POS , MODE_TRADES ))
if ( OrderOpenTime ()>=today)
{
if ( OrderType ()== OP_BUY ) totalOrdersLong++;
if ( OrderType ()== OP_SELL ) totalOrdersShort++;
}
}
if (totalOrdersLong <MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if (totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
Merhaba Mladen,
yardımınız için çok teşekkür ederim, şimdi bununla nasıl başa çıkılacağı daha netleşti.
Bir "günlük kar hedefi" olup olmadığını kontrol etmek de mümkün müdür? Diyelim ki EA günde 50.- EUR'ya gitmeli,
günlük hedefe ulaşılırsa, ticareti durdurur ve ertesi gün devam eder....
Muhtemelen şöyle bir şey:
if ( AccountProfit ()<= profitTarget)
{
datetime today = StringToTime ( TimeToString ( TimeCurrent (), TIME_DATE ));
int totalOrdersLong = 0 , totalOrdersShort = 0 ;
for ( int y= OrdersHistoryTotal ()- 1 ;y>= 0 ; y--)
{
if ( OrderSelect (y, SELECT_BY_POS , MODE_HISTORY ))
if ( OrderCloseTime ()>=today)
{
if ( OrderType ()== OP_BUY ) totalOrdersLong++;
if ( OrderType ()== OP_SELL ) totalOrdersShort++;
}
}
for ( int y= OrdersTotal ()- 1 ;y>= 0 ; y--)
{
if ( OrderSelect (y, SELECT_BY_POS , MODE_TRADES ))
if ( OrderOpenTime ()>=today)
{
if ( OrderType ()== OP_BUY ) totalOrdersLong++;
if ( OrderType ()== OP_SELL ) totalOrdersShort++;
}
}
if (totalOrdersLong <MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if (totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
}
// Check if Profit Targer for the day is reached, so close all open Opsitions
if ( AccountProfit ()>= profitTarget)
{
if ( OrderSelect (buy_ticket, SELECT_BY_TICKET ))
{
dummyResult= OrderClose ( OrderTicket (), OrderLots (), Bid ,Slippage*PipMultiplier,MediumSeaGreen);
Print ( "Error closing Buy #" ,( string ) OrderTicket (), " Error code " ,( string ) GetLastError ());
}
}
else
if (Order==SIGNAL_CLOSESELL && sell_ticket!= 0 )
{
if ( OrderSelect (sell_ticket, SELECT_BY_TICKET ))
{
dummyResult= OrderClose ( OrderTicket (), OrderLots (), Ask ,Slippage*PipMultiplier,DarkOrange);
Print ( "Error closing Sell #" ,( string ) OrderTicket (), " Error code " ,( string ) GetLastError ());
}
}
Merhaba Mladen,
yardımınız için çok teşekkür ederim, şimdi bununla nasıl başa çıkılacağı daha netleşti.
Bir "günlük kar hedefi" olup olmadığını kontrol etmek de mümkün müdür? Diyelim ki EA günde 50.- EUR'ya gitmeli,
günlük hedefe ulaşılırsa, ticareti durdurur ve ertesi gün devam eder....
Muhtemelen şöyle bir şey:
if ( AccountProfit ()<= profitTarget)
{
datetime today = StringToTime ( TimeToString ( TimeCurrent (), TIME_DATE ));
int totalOrdersLong = 0 , totalOrdersShort = 0 ;
for ( int y= OrdersHistoryTotal ()- 1 ;y>= 0 ; y--)
{
if ( OrderSelect (y, SELECT_BY_POS , MODE_HISTORY ))
if ( OrderCloseTime ()>=today)
{
if ( OrderType ()== OP_BUY ) totalOrdersLong++;
if ( OrderType ()== OP_SELL ) totalOrdersShort++;
}
}
for ( int y= OrdersTotal ()- 1 ;y>= 0 ; y--)
{
if ( OrderSelect (y, SELECT_BY_POS , MODE_TRADES ))
if ( OrderOpenTime ()>=today)
{
if ( OrderType ()== OP_BUY ) totalOrdersLong++;
if ( OrderType ()== OP_SELL ) totalOrdersShort++;
}
}
if (totalOrdersLong <MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if (totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
}
// Check if Profit Targer for the day is reached, so close all open Opsitions
if ( AccountProfit ()>= profitTarget)
{
if ( OrderSelect (buy_ticket, SELECT_BY_TICKET ))
{
dummyResult= OrderClose ( OrderTicket (), OrderLots (), Bid ,Slippage*PipMultiplier,MediumSeaGreen);
Print ( "Error closing Buy #" ,( string ) OrderTicket (), " Error code " ,( string ) GetLastError ());
}
}
else
if (Order==SIGNAL_CLOSESELL && sell_ticket!= 0 )
{
if ( OrderSelect (sell_ticket, SELECT_BY_TICKET ))
{
dummyResult= OrderClose ( OrderTicket (), OrderLots (), Ask ,Slippage*PipMultiplier,DarkOrange);
Print ( "Error closing Sell #" ,( string ) OrderTicket (), " Error code " ,( string ) GetLastError ());
}
}
Şu anda açık olan uzun ve kısa sipariş numaralarını kontrol eden döngüye neden biraz kar toplama (toplama) eklemiyorsunuz?
Bunun gibi bir şey:
double profitSoFarLong= 0 ,profitSoFarShort= 0 ;
for ( int y= OrdersTotal ()- 1 ;y>= 0 ; y--)
{
if ( OrderSelect (y, SELECT_BY_POS , MODE_TRADES ))
if ( OrderOpenTime ()>=today)
{
if ( OrderType ()== OP_BUY ) { totalOrdersLong++; profitSoFarLong += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
if ( OrderType ()== OP_SELL ) { totalOrdersShort++; profitSoFarShort += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
}
}
Ardından daha fazla kontrol için profitSoFarLong ve profitSoFarShort'u kullanabilirsiniz.
Not: Toplamı almak isterseniz (kapalı ve açık siparişler için), daha önce kapatılmış siparişlere de benzer kod eklemesi yapılabilir)
Merhaba Mladen,
"AutoFiboAutoTrend" göstergesini benim için düzelttiniz ve iyi çalışıyor. Fibo yönü "yukarı"dan "aşağı"ya değiştiğinde bildirimli sesli uyarı eklemek mümkün müdür? Lütfen resimlere bakın 1 + 2
teşekkür ederim Lea
Şu anda açık olan uzun ve kısa sipariş numaralarını kontrol eden döngüye neden biraz kar toplama (toplama) eklemiyorsunuz?
Bunun gibi bir şey:
double profitSoFarLong= 0 ,profitSoFarShort= 0 ;
for ( int y= OrdersTotal ()- 1 ;y>= 0 ; y--)
{
if ( OrderSelect (y, SELECT_BY_POS , MODE_TRADES ))
if ( OrderOpenTime ()>=today)
{
if ( OrderType ()== OP_BUY ) { totalOrdersLong++; profitSoFarLong += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
if ( OrderType ()== OP_SELL ) { totalOrdersShort++; profitSoFarShort += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
}
}
Ardından daha fazla kontrol için profitSoFarLong ve profitSoFarShort'u kullanabilirsiniz.
Not: Toplamı almak isterseniz (kapalı ve açık siparişler için), daha önce kapatılmış siparişlere de benzer kod eklemesi yapılabilir)
Merhaba Mladen,
yardımın için çok teşekkür ederim!
Kodu şu şekilde uyguladım:
datetime today = StringToTime ( TimeToString ( TimeCurrent (), TIME_DATE ));
int totalOrdersLong = 0 , totalOrdersShort = 0 ;
int x;
for (x= OrdersHistoryTotal ()- 1 ;x>= 0 ; x--)
{
if ( OrderSelect (x, SELECT_BY_POS , MODE_HISTORY ))
if ( OrderCloseTime ()>=today)
{
if ( OrderType ()== OP_BUY ) totalOrdersLong++;
if ( OrderType ()== OP_SELL ) totalOrdersShort++;
}
}
for (x= OrdersTotal ()- 1 ;x>= 0 ; x--)
{
if ( OrderSelect (x, SELECT_BY_POS , MODE_TRADES ))
if ( OrderOpenTime ()>=today)
{
if ( OrderType ()== OP_BUY ) totalOrdersLong++;
if ( OrderType ()== OP_SELL ) totalOrdersShort++;
}
}
double profitSoFarLong= 0 ,profitSoFarShort= 0 ;
for (x= OrdersTotal ()- 1 ;x>= 0 ; x--)
{
if ( OrderSelect (x, SELECT_BY_POS , MODE_TRADES ))
if ( OrderOpenTime ()>=today)
{
if ( OrderType ()== OP_BUY ) { totalOrdersLong++; profitSoFarLong += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
if ( OrderType ()== OP_SELL ) { totalOrdersShort++; profitSoFarShort += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
}
}
// EA STOP if Profit is Reached.
if (profitSoFarLong> 50 || profitSoFarLong> 50 )
{
if ( OrderType ()== OP_BUY ) { dummyResult = OrderClose ( OrderTicket (), OrderLots (), MarketInfo (s_symbol, MODE_ASK ), 0 ,CLR_NONE); }
if ( OrderType ()== OP_SELL ) { dummyResult = OrderClose ( OrderTicket (), OrderLots (), MarketInfo (s_symbol, MODE_BID ), 0 ,CLR_NONE); }
Print ( "Account Profit Reached. All Open Trades Have Been Closed" );
return ( 0 );
Sleep ( 3600 ); // one hour
}
lütfen bana yardım et mladen. SLIPPAGE ekli EA'da çalışmıyor
Rajiv
Slippage, OrderSend() çağrılarında doğru yerdedir - daha büyük bir değer kullanmayı deneyin ve kod kullanımı uygun olduğundan test edin
Lütfen bana yardım edin... Tüm dışa aktarma yöntemleriyle her "Kapat" .csv dosyasına yazmak mümkündür.
kodda bu gösterge
void RSI_output(string SymbolName,int PeriodMinutes)
{
int size=iBars(SymbolName,PeriodMinutes); if(size==0) return;
int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV); if (handle<0)return;
FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
for (int i=size-1;i>=0;i--)
{
FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))
,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)
,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));
}
FileClose(handle);
return;
}
int start() { RSI_output(_Symbol,_Period); return(0); }
Her "kapanışta", üzerine gelmeden ve güncelleme dosyasını yeniden .csv dosyasına kaydetmek istiyorum. Sadece bir satırda bir dosyayı bitirmek .. her dakika, örneğin)))))))) LÜTFEN LÜTFEN LÜTFEN. Bana R ile etkileşim için çalışan bir araç ver.
Lütfen bana yardım edin... Tüm dışa aktarma araçlarıyla her "Kapat" .csv dosyasına yazmak mümkündür.
kodda bu gösterge
void RSI_output(string SymbolName,int PeriodMinutes)
{
int size=iBars(SymbolName,PeriodMinutes); if(size==0) return;
int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV); if (handle<0)return;
FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
for (int i=size-1;i>=0;i--)
{
FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))
,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)
,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));
}
FileClose(handle);
return;
}
int start() { RSI_output(_Symbol,_Period); return(0); }
Her "kapanışta", üzerine gelmeden ve güncelleme dosyasını yeniden .csv dosyasına kaydetmek istiyorum. Sadece bir satırda bir dosyayı bitirmek .. her dakika, örneğin)))))))) LÜTFEN LÜTFEN LÜTFEN. Bana R ile etkileşim için çalışan bir araç ver.
Evet. programdakilerin geçmişi + 1 bar (& iCustom göstergelerim). sadece dosyayı sonsuza kadar yeniden yazmadan sorun.
İşte seçeneği olan bir sürüm - eski veri dosyasını yeniden yazmalı mı yoksa her yeni çubuk için her zaman yeni bir dosya oluşturmalı mı?
#property indicator_buffers 0
extern bool RewriteOldData= true ;
void RSI_output( string symbolName, int PeriodMinutes, datetime time)
{
string name = (RewriteOldData) ? symbolName+PeriodMinutes : symbolName+PeriodMinutes+( string )(time/ 60 );
int size = iBars (symbolName,PeriodMinutes); if (size== 0 ) return ;
int handle= FileOpen (name+ "_RSI.csv" , FILE_WRITE | FILE_CSV ); if (handle< 0 ) return ;
FileWrite (handle, "Time seconds;Time;Open;Low;High;Close;Volume;RSI" );
for ( int i=size- 1 ;i>= 0 ;i--)
FileWrite (handle, iTime (symbolName,PeriodMinutes,i), TimeToStr ( iTime (symbolName,PeriodMinutes,i))
, iOpen (symbolName,PeriodMinutes,i), iLow (symbolName,PeriodMinutes,i), iHigh (symbolName,PeriodMinutes,i)
, iClose (symbolName,PeriodMinutes,i), iVolume (symbolName,PeriodMinutes,i), iCustom (symbolName,PeriodMinutes, "RSI" , 0 ,i));
FileFlush (handle);
FileClose (handle);
return ;
}
int start()
{
static datetime lastTime= 0 ;
if (lastTime!= Time [ 0 ]) RSI_output( _Symbol , _Period , Time [ 0 ]);
lastTime= Time [ 0 ];
return ( 0 );
}
Bu bir göstergedir ve tüm yapmanız gereken RewriteOldData parametresini ayarlamak ve çalışmasına izin vermektir.