J'ai vérifié dans le testeur - cela ne fonctionne pas, je pense que cela ne fonctionnera pas pour la réalité aussi, parce que la position pour laquelle il est vérifié n'existe plus.
Andrey Dik: J'ai vérifié dans le testeur - cela ne fonctionne pas, et je pense que cela ne fonctionnera pas sur le réel, parce que la position pour laquelle le test va n'existe déjà pas.
Il s'agit d'une erreur artificielle dans le testeur (afin de ne pas le ralentir du tout). Par simple logique, tout est correct.
// Подсчет комиссий и свопов указанной позиции по символу 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); //тикет сделки
fxsaber: Si cela se produit après OrderSend, c'est normal.
Non, ce n'est en aucun cas normal. Dans tous les cas, il y a une position, et donc des transactions qui ont participé à sa "vie". Mais ce qui est plus étrange, c'est que le code ne voit pas les transactions même si l'EA est déjà en position, on le voit dans les logs, le nombre de positions est défini, la position pour le symbole est sélectionnée, mais il n'y a pas de transactions dedans....
Andrey Dik: Non, ce n'est en aucun cas normal. Dans tous les cas, il y a une position et donc des transactions qui ont participé à sa "vie". Ce qui est plus étrange, c'est que le code ne voit pas les transactions même si le Conseiller Expert a déjà eu une position...
Renat dit que c'est normal, ne discutez pas ! Voici la solution pour OrderSend
fxsaber: Renat dit que c'est normal, ne discutez pas ! Voici la solution pour OrderSend
Si vous utilisez cet OrderSend, il n'y aura pas de tels problèmes.
Ou attendez les messages appropriés dans OnTradeTransaction.
Non, ce n'est pas normal.
Il y a une position. Nous envoyons le conseiller expert sur le graphique. Nous n'avons pas d'historique des échanges pour la position sélectionnée. Qu'est-ce qui est normal ici ?)))
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Il n'y a aucun moyen de la définir. SL et TP sont uniquement l'essence du serveur MT.
C'est comme ça que ça marche :
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.");
}
}
Variante de travail pour la réalité (pas pour le testeur)
{
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.");
}
}
J'ai vérifié dans le testeur - cela ne fonctionne pas, et je pense que cela ne fonctionnera pas sur le réel, parce que la position pour laquelle le test va n'existe déjà pas.
{
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);
}
Il semble avoir cassé la sélection de l'historique des transactions par ID de position.
L'impression écrit parfois (et parfois non)
2016.12.05 11:26:11.767 Obtenir la commission actuelle de la pos (GBPUSD,M5) 1
2016.12.05 11:26:11.767 Obtenir la commission actuelle de la pos (GBPUSD,M5) GBPUSD
2016.12.05 11:26:11.767 Obtenir la commission actuelle de la position (GBPUSD,M5) Position trouvée
2016.12.05 11:26:11.767 Obtenir la commission actuelle de la position (GBPUSD,M5) Total des transactions dans la position : 0
Il semble que la sélection de l'historique des transactions par ID de poste soit tombée en panne.
Si cela se produit après OrderSend, c'est normal.
Non, ce n'est en aucun cas normal. Dans tous les cas, il y a une position et donc des transactions qui ont participé à sa "vie". Ce qui est plus étrange, c'est que le code ne voit pas les transactions même si le Conseiller Expert a déjà eu une position...
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie
Comment travailler correctement dans MT5 avec OrderSend ?
fxsaber, 2016.11.19 23:59
Ripped OrderSendSync de la bibliothèque iciconst 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
Si vous utilisez cet OrderSend, vous n'aurez pas de tels problèmes.
Soit attendre les messages appropriés dans OnTradeTransaction.
Renat dit que c'est normal, ne discutez pas ! Voici la solution pour OrderSend
Si vous utilisez cet OrderSend, il n'y aura pas de tels problèmes.
Ou attendez les messages appropriés dans OnTradeTransaction.
Non, ce n'est pas normal.
Il y a une position. Nous envoyons le conseiller expert sur le graphique. Nous n'avons pas d'historique des échanges pour la position sélectionnée. Qu'est-ce qui est normal ici ?)))