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
Ve sonra, eğer küfür edersek, o zaman yararlı bir konudan birkaç sayfa çekişmeye geçeceğiz. Sonra her şeyi temizleyin ki öz kalsın... Tam olarak şu ya da bu sürecin özünün burada gösterilmesini istiyorum. Bir şeyin herhangi bir uygulaması için birkaç seçenek olsun. Her yöntemin avantajları ve dezavantajları tartışılacaktır.
Ardından, yeterince farklı yararlı bilgi biriktiğinde, tüm bunları bir tablette toplama fikri ortaya çıkıyor. Ve düzenli olarak faydalı cips birikimi ile sürekli olarak yenileyin.
Herkes için faydalı olacağını düşünüyorum.
Yanıtlar:
1.
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
8 ve 16 ritza
Taras Slobodyanik , 2017.02.24 22:16
{
string s = "" , c;
while (n != 0 )
{
if (n% 16 < 10 )
c= CharToStr (n% 16 + '0' );
else
c= CharToStr (n% 16 + 'A' - 10 );
s = c + s;
n = n / 16 ;
}
return (s);
}
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
8 ve 16 ritza
Maksim Kuznetsov , 2017.02.24 22:20
birdenbire, StringFormat, PrintFormat :-)PrintFormat("Onaltılık %x ve sekizlik %o",1122,1122);
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
8 ve 16 ritza
fxsaber , 2017.02.24 22:21
{
static const string digits[] = { "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" ,
"A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "K" ,
"L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "V" , "X" , "Y" , "Z" };
string Str = (Num == 0 ) ? "0" : "" ;
while (Num > 0 )
{
Str = digits[Num % Scale] + Str;
Num /= Scale;
}
return (Str);
}
void OnStart ()
{
Print (NumToString( 123 , 8 ));
Print (NumToString( 123 , 16 ));
}
Tam teşekküllü bir ticaret robotunun bir senaryoya yazılabileceğine cidden inanıyor musunuz?
Yoldaşlar fxsaber ve prostotrader'ın tartışmasını ayrı bir başlığa taşıyın, burada tartışmalar varsa, konu pratik önemini kaybeder. Gerçek bir çözüme ulaştıklarında buraya yazacaklar. Ve inanıyorum ki, bu bir şüphe veya araştırma dalı olmamalıdır. Bu, pratik çözümlerin bir dalı olmalıdır. Ve eğer birkaç kişi konuyla ilgili farklı vizyonlara sahipse, bırakın konuyu başka yerde tartışsınlar.
<silinecek gönderi>
Birkaç milisaniye beklemeye gerek yok.
Mesaj OnTradeTransaction'a gönderilecek
kodu gör
Mesajınızın anlamı nedir? Peki, OnTradeTransaction()'a gelecek, ne olmuş yani? Bu, etkinliği beklemeniz gerektiği anlamına gelir. Hala bekliyorum. fxsaber mesajının anlamı, OrderSend()'in yürütülmesinden sonra, gerçekleştirilen eylemle ilgili bilgilerin uçbirimde hemen görünmemesidir. Birisi OnTradeTransaction() için beklemeyi sever, biri listedeki bir siparişin veya anlaşmanın görünümünü beğenir. Örneğin, MT4'ten farkı. M4'te OrderSend()'den sonra sipariş zaten emirler listesindedir ve OrderClose()'dan sonra her zaman geçmiştedir.
Gelin gerçeği bulalım. Bunu düşünmek için zaman vardı ve onu bırakmaya karar verdim ve şüphelerimi ortadan kaldırmasını istediğim ve sorduğum Vitya (Vinin) de tartışmayı bırakmayı teklif etti (kaldırmadaki şüphelerimi onaylayarak) - gerçeği kabul edelim. doğmak. Bence bu daha doğru olur. Her neyse, daha sonra bir tablette toplamaya başlayacağım, böylece burada dolgulu olarak uygulayabilirim.
Gerçeği bulalım...
Artyom!
Sen akıllı ve politik olarak doğru bir insansın!
Hangi gerçek? Neyin tehlikede olduğunu gayet iyi anlıyorsun.
fxsaber bir senaryo yazdı (fena değil), ama kimse onu övmedi, işte burada
her konuda hatırlatmaya çalışır.
Övgü - aferin!
Ancak sorun şu ki, bu komut dosyasında OnTradeTransaction'ı kullanamazsınız, bu nedenle topları "Bay" dan yuvarlamanız gerekir (Uyku veya başka bir zamanlayıcı gibi)
Ve elbette, SCRIPT'in DANIŞMAN'dan daha iyi olduğunu henüz bilmeyen diğer kullanıcılar için "bakım"!
Ve Dmitry Fedoseev , söylediklerime her zaman apriori olarak karşı çıkıyor ve haklı olup olmamam önemli değil.
Gerçek burada bulunamaz, çünkü İŞ değil, KİŞİSEL öne çıkar.
{
private :
static const bool IsTester;
static bool Waiting( const bool FlagInit = false )
{
static ulong StartTime = 0 ;
const bool Res = FlagInit ? false : (:: GetMicrosecondCount () - StartTime < ORDERSEND::OrderSend_MaxPause);
if (FlagInit)
StartTime = :: GetMicrosecondCount ();
else if (Res)
:: Sleep ( 0 );
return (Res);
}
static bool EqualPrices( const double Price1, const double Price2, const int digits)
{
return (:: NormalizeDouble (Price1 - Price2, digits) == 0 );
}
static bool HistoryDealSelect ( MqlTradeResult &Result )
{
if ((Result.deal == 0 ) && (Result.order != 0 ))
{
if (:: HistorySelectByPosition (:: HistoryOrderGetInteger (Result.order, ORDER_POSITION_ID )))
for ( int i = :: HistoryDealsTotal () - 1 ; i >= 0 ; i--)
{
const ulong DealTicket = :: HistoryDealGetTicket (i);
if (Result.order == :: HistoryDealGetInteger (DealTicket, DEAL_ORDER ))
{
Result.deal = DealTicket;
break ;
}
}
}
return (:: HistoryDealSelect (Result.deal));
}
#define TMP_ORDERSEND_BENCHMARK(A) \
static ulong Max ##A = 0 ; \
\
if (Interval ##A > Max ##A) \
{ \
ORDERSEND_BENCHMARK \
\
Max ##A = Interval ##A; \
}
static void OrderSend_Benchmark( const ulong Interval1, const ulong Interval2 = 0 )
{
#ifdef ORDERSEND_BENCHMARK
TMP_ORDERSEND_BENCHMARK( 1 )
TMP_ORDERSEND_BENCHMARK( 2 )
#endif // ORDERSEND_BENCHMARK
return ;
}
#undef TMP_ORDERSEND_BENCHMARK
#define WHILE(A) while ((!(Res = (A))) && ORDERSEND::Waiting())
public :
static uint OrderSend_MaxPause; // максимальное время на синхронизацию в мкс.
// Полностью синхронизированный с торговым окружением OrderSend.
// По окончании работы ГАРАНТИРОВАННО и за МИНИМАЛЬНОЕ время доступно корректное торговое окружение.
// По скорости ничем не уступает связке OrderSendAsync + OnTradeTransaction.
// Учтены MT5-нюансы: Result.deal == 0, STATE_STARTED и STATE_MODIFY pending.
// В тестере/оптимизаторе производительность равна штатной OrderSend.
static bool OrderSendSync( const MqlTradeRequest &Request, MqlTradeResult &Result )
{
const ulong StartTime1 = :: GetMicrosecondCount ();
bool Res = :: OrderSend (Request, Result);
const ulong Interval1 = :: GetMicrosecondCount () - StartTime1;
const ulong StartTime2 = :: GetMicrosecondCount ();
if (Res && !ORDERSEND::IsTester && (Result.retcode < TRADE_RETCODE_ERROR ) && (ORDERSEND::OrderSend_MaxPause > 0 ))
{
Res = (Result.retcode == TRADE_RETCODE_DONE );
ORDERSEND::Waiting( true );
if (Request.action == TRADE_ACTION_DEAL )
{
WHILE(:: HistoryOrderSelect (Result.order))
;
Res = Res && ((( ENUM_ORDER_STATE ):: HistoryOrderGetInteger (Result.order, ORDER_STATE ) == ORDER_STATE_FILLED ) ||
(( ENUM_ORDER_STATE ):: HistoryOrderGetInteger (Result.order, ORDER_STATE ) == ORDER_STATE_PARTIAL ));
if (Res)
WHILE(ORDERSEND:: HistoryDealSelect (Result))
;
}
else if (Request.action == TRADE_ACTION_PENDING )
{
if (Res)
WHILE(:: OrderSelect (Result.order) && (( ENUM_ORDER_STATE ):: OrderGetInteger ( ORDER_STATE ) == ORDER_STATE_PLACED ))
;
else
{
WHILE(:: HistoryOrderSelect (Result.order))
;
Res = false ;
}
}
else if (Request.action == TRADE_ACTION_SLTP )
{
if (Res)
{
bool EqualSL = false ;
bool EqualTP = false ;
const int digits = ( int ):: SymbolInfoInteger (Request.symbol, SYMBOL_DIGITS );
if ((Request.position == 0 ) ? :: PositionSelect (Request.symbol) : :: PositionSelectByTicket (Request.position))
{
EqualSL = ORDERSEND::EqualPrices(:: PositionGetDouble ( POSITION_SL ), Request.sl, digits);
EqualTP = ORDERSEND::EqualPrices(:: PositionGetDouble ( POSITION_TP ), Request.tp, digits);
}
WHILE((EqualSL && EqualTP))
if ((Request.position == 0 ) ? :: PositionSelect (Request.symbol) : :: PositionSelectByTicket (Request.position))
{
EqualSL = ORDERSEND::EqualPrices(:: PositionGetDouble ( POSITION_SL ), Request.sl, digits);
EqualTP = ORDERSEND::EqualPrices(:: PositionGetDouble ( POSITION_TP ), Request.tp, digits);
}
}
}
else if (Request.action == TRADE_ACTION_MODIFY )
{
if (Res)
{
bool EqualSL = false ;
bool EqualTP = false ;
bool EqualPrice = false ;
const int digits = ( int ):: SymbolInfoInteger (Request.symbol, SYMBOL_DIGITS );
if (:: OrderSelect (Result.order))
{
EqualSL = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_SL ), Request.sl, digits);
EqualTP = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_TP ), Request.tp, digits);
EqualPrice = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_PRICE_OPEN ), Request.price, digits);
}
WHILE((EqualSL && EqualTP && EqualPrice))
if (:: OrderSelect (Result.order) && (( ENUM_ORDER_STATE ):: OrderGetInteger ( ORDER_STATE ) != ORDER_STATE_REQUEST_MODIFY ))
{
EqualSL = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_SL ), Request.sl, digits);
EqualTP = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_TP ), Request.tp, digits);
EqualPrice = ORDERSEND::EqualPrices(:: OrderGetDouble ( ORDER_PRICE_OPEN ), Request.price, digits);
}
}
}
else if (Request.action == TRADE_ACTION_REMOVE )
if (Res)
WHILE(:: HistoryOrderSelect (Result.order))
;
}
const ulong Interval2 = :: GetMicrosecondCount () - StartTime2;
Result.comment += " " + :: DoubleToString (Interval1 / 1000.0 , 3 ) + " + " + :: DoubleToString (Interval2 / 1000.0 , 3 ) + " ms" ;
ORDERSEND::OrderSend_Benchmark(Interval1, Interval2);
return (Res);
}
#undef WHILE
};
static const bool ORDERSEND::IsTester = (:: MQLInfoInteger ( MQL_TESTER ) || :: MQLInfoInteger ( MQL_OPTIMIZATION ) ||
:: MQLInfoInteger ( MQL_VISUAL_MODE ) || :: MQLInfoInteger ( MQL_FRAME_MODE ));
static uint ORDERSEND::OrderSend_MaxPause = 1000000 ; // максимальное время на синхронизацию в мкс.
// Эта строчка позволяет сделать все OrderSend корректными.
#define OrderSend ORDERSEND::OrderSendSync
Olası sorunları azaltmak için her şey özel olarak sınıfa sarılır.
Başvuru
Onlar. Tüm OrderSends'leri ticaret ortamıyla senkronize hale getirmek ve tuzaklardan kaçınmak için verilen kaynağı bir mqh dosyası olarak düzenlemek ve programlarınızda uygun #include'u yapmak yeterlidir.