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
Evet, belirlenemez. SL ve TP, yalnızca MT sunucusunun özüdür.
Bu nasıl çalışır:
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
if (trans.type== TRADE_TRANSACTION_DEAL_ADD )
{
datetime end= TimeCurrent ();
datetime start=end-end% PeriodSeconds ( PERIOD_D1 );
ResetLastError ();
if (! HistorySelect (start,end))
{
Print ( "Getting deals history failed. Error " , GetLastError ());
return ;
}
ulong ticket= HistoryDealGetTicket ( HistoryDealsTotal ()- 1 );
if (ticket==trans.deal)
{
if ( HistoryDealGetInteger (ticket, DEAL_ENTRY )== DEAL_ENTRY_OUT &&
( StringFind ( HistoryDealGetString (ticket, DEAL_COMMENT ), "tp" )!=- 1
|| StringFind ( HistoryDealGetString (ticket, DEAL_COMMENT ), "sl" )!=- 1 ))
{
Print ( HistoryDealGetString (ticket, DEAL_SYMBOL ), " Profit= " , HistoryDealGetDouble (ticket, DEAL_PROFIT ), " ticket=" ,ticket);
}
}
}
}
{
if ((Trans.type == TRADE_TRANSACTION_ORDER_ADD ) &&
PositionSelectByTicket (Trans.position) && OrderSelect (Trans.order) &&
( PositionGetInteger ( POSITION_TYPE ) == 1 - OrderGetInteger ( ORDER_TYPE )))
{
const double Price = OrderGetDouble ( ORDER_PRICE_OPEN );
if (Price == PositionGetDouble ( POSITION_TP ))
Print ( "Position #" + ( string )Trans.position + " - triggered TP." );
else if (Price == PositionGetDouble ( POSITION_SL ))
Print ( "Position #" + ( string )Trans.position + " - triggered SL." );
}
}
Gerçek çalışan sürüm (test cihazı için değil)
{
if ((Trans.type == TRADE_TRANSACTION_ORDER_ADD ) &&
PositionSelectByTicket (Trans.position) && OrderSelect (Trans.order) &&
( PositionGetInteger ( POSITION_TYPE ) == 1 - OrderGetInteger ( ORDER_TYPE )))
{
const double Price = OrderGetDouble ( ORDER_PRICE_OPEN );
if (Price == PositionGetDouble ( POSITION_TP ))
Print ( "Position #" + ( string )Trans.position + " - triggered TP." );
else if (Price == PositionGetDouble ( POSITION_SL ))
Print ( "Position #" + ( string )Trans.position + " - triggered SL." );
}
}
Test cihazında kontrol ettim - çalışmıyor, bence gerçek hayatta da çalışmayacak, çünkü kontrolün yapıldığı pozisyon artık mevcut değil.
{
string s = DoubleToString (PosTotalCommissSwap ( Symbol (), true , true ), 4 );
Comment (s);
}
//+------------------------------------------------------------------+
// Подсчет комиссий и свопов указанной позиции по символу
double PosTotalCommissSwap ( string symb, bool commiss, bool swap)
{
int posTotal = PositionsTotal (); //всего открытых позиций
Print (posTotal);
//пройдем по всем открытым позициям
for ( int i = posTotal - 1 ; i >= 0 ; i--)
{
string posSymb = PositionGetSymbol (i);
Print (posSymb);
//если найдена позиция по указанному символу
if (symb == posSymb)
{
Print ( "Позиция найдена" );
long posID = PositionGetInteger ( POSITION_IDENTIFIER );
//выберем историю сделок, относящуюся к выбранной позиции
if ( HistorySelectByPosition (posID))
{
int dealsTotal = HistoryDealsTotal (); //всего сделок в истории позиции
Print ( "Всего сделок в позиции: " + dealsTotal);
double fees = 0.0 ; //все комиссии и свопы
//пройдем по всем сделкам позиции
for ( int k = 0 ; k < dealsTotal; k++)
{
ulong dealTicket = HistoryDealGetTicket (k); //тикет сделки
if (commiss)
fees += HistoryDealGetDouble (dealTicket, DEAL_COMMISSION );
if (swap)
fees += HistoryDealGetDouble (dealTicket, DEAL_SWAP );
}
return (fees);
}
else
Print ( "Историю сделок выбрать не удалось" );
}
}
return ( 0.0 );
}
Konum kimliğine göre işlem geçmişi seçimi bozuldu gibi görünüyor.
Baskı bazen (ve bazen değil) yazar
2016.12.05 11:26:11.767 Mevcut pos komisyonunu alın (GBPUSD,M5) 1
2016.12.05 11:26:11.767 Mevcut pos komisyonunu alın (GBPUSD,M5) GBPUSD
2016.12.05 11:26:11.767 Mevcut pos komisyonunu alın (GBPUSD,M5) Konum bulundu
2016.12.05 11:26:11.767 Mevcut pos komisyonunu alın (GBPUSD,M5) Pozisyondaki toplam fırsatlar: 0
Konum kimliğine göre işlem geçmişi seçimi bozuldu gibi görünüyor.
Bu, OrderSend'den sonra olursa, sorun değil.
Hayır, hiç normal değil. Her durumda, bir pozisyon var, yani "hayatına" katılan işlemler var. Ama daha da tuhafı, zaten bir pozisyonun varlığında danışmanı atsanız bile kodun işlemi görmemesi...
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
OrderSend ile MT5'te nasıl düzgün çalışılır
fxsaber , 2016.11.19 23:59
Senkronize OrderSendSync'i buradaki kitaplıktan yırtınconst bool IsTester = (:: MQLInfoInteger ( MQL_TESTER ) || :: MQLInfoInteger ( MQL_OPTIMIZATION ) ||
:: MQLInfoInteger ( MQL_VISUAL_MODE ) || :: MQLInfoInteger ( MQL_FRAME_MODE ));
bool Waiting( const bool FlagInit = false )
{
static ulong StartTime = 0 ;
if (FlagInit)
StartTime = :: GetMicrosecondCount ();
const bool Res = (:: GetMicrosecondCount () - StartTime < OrderSend_MaxPause);
if (Res)
:: Sleep ( 0 );
return (Res);
}
bool EqualPrices( const double Price1, const double Price2, const int digits)
{
return (:: NormalizeDouble (Price1 - Price2, digits) == 0 );
}
#define WHILE(A) while (!(Res = (A)) && Waiting())
bool OrderSendSync ( const MqlTradeRequest &Request, MqlTradeResult &Result )
{
bool Res = :: OrderSend (Request, Result);
if (Res && !IsTester && (Result.retcode < TRADE_RETCODE_ERROR ) && (OrderSend_MaxPause > 0 ))
{
Res = (Result.retcode == TRADE_RETCODE_DONE );
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(:: HistoryDealSelect (Result.deal))
;
}
else if (Request.action == TRADE_ACTION_PENDING )
{
if (Res)
WHILE(:: OrderSelect (Result.order))
;
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 = EqualPrices(:: PositionGetDouble ( POSITION_SL ), Request.sl, digits);
EqualTP = EqualPrices(:: PositionGetDouble ( POSITION_TP ), Request.tp, digits);
}
WHILE((EqualSL && EqualTP))
if ((Request.position == 0 ) ? :: PositionSelect (Request.symbol) : :: PositionSelectByTicket (Request.position))
{
EqualSL = EqualPrices(:: PositionGetDouble ( POSITION_SL ), Request.sl, digits);
EqualTP = EqualPrices(:: PositionGetDouble ( POSITION_TP ), Request.tp, digits);
}
}
}
else if (Request.action == TRADE_ACTION_MODIFY )
{
if (Res)
{
bool EqualSL = false ;
bool EqualTP = false ;
const int digits = ( int ):: SymbolInfoInteger (Request.symbol, SYMBOL_DIGITS );
if (:: OrderSelect (Result.order))
{
EqualSL = EqualPrices(:: OrderGetDouble ( ORDER_SL ), Request.sl, digits);
EqualTP = EqualPrices(:: OrderGetDouble ( ORDER_TP ), Request.tp, digits);
}
WHILE((EqualSL && EqualTP))
if (:: OrderSelect (Result.order))
{
EqualSL = EqualPrices(:: OrderGetDouble ( ORDER_SL ), Request.sl, digits);
EqualTP = EqualPrices(:: OrderGetDouble ( ORDER_TP ), Request.tp, digits);
}
}
}
else if (Request.action == TRADE_ACTION_REMOVE )
if (Res)
WHILE(:: HistoryOrderSelect (Result.order))
;
}
return (Res);
}
#undef WHILE
Bu OrderSend'i kullanırsanız, böyle bir sorun olmayacaktır.
Veya OnTradeTransaction'da ilgili mesajları bekleyin.
Renat sorun olmadığını söylüyor, tartışma! İşte OrderSend için çözüm
Bu OrderSend'i kullanırsanız, böyle bir sorun olmayacaktır.
Veya OnTradeTransaction'da ilgili mesajları bekleyin.
Hayır, normal değil.
Bir pozisyon var. Danışmanı grafiğe atıyoruz. Seçilen pozisyon için ticaret geçmişi yok . Burada normal olan nedir?