cela fonctionne bien - (en fonction de quel objectif !?)
#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---int total=PositionsTotal();
int Ordertotal=OrdersTotal();
while(!IsStopped() && (total <= 1)) // Закончим, когда появится более одной позиции.if(total == 1)
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.elseif(Ordertotal!=0)
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}
//+------------------------------------------------------------------+
La plupart des courtiers travaillent selon le même schéma : Result.deal == 0.
Signals, par exemple, est le courtier le plus populaire pour le scalping.
Parmi les courtiers connus, il est assez difficile de trouver un MT5 qui fonctionne selon un schéma différent.
Je ne sais pas quel type de scalping fonctionne à tel point que vous n'avez pas le temps de fermer une position...
Si cela ne vous dérange pas, essayez quand même d'ajouter la vérification du nombre de positions
elseif(!PositionsTotal() && !OrdersTotal())
Je pense que les deux positions sont ouvertes et fermées. Cela ne ferait pas de mal d'essayer d'obtenir les types de ces deux positions. S'ils sont dirigés différemment, cela confirmera mes soupçons...
Obtenez le statut de cette commande. Si le ticket est connu.
La transaction a échoué, le prix d'exécution est de 0.
Structure du résultat de la demande de transaction (MqlTradeResult)
En réponse à une demande de transaction, le serveur de transaction renvoie des données contenant le résultat du traitement de la demande de transaction sous la forme d'une structure prédéfinie spéciale MqlTradeResult.
structMqlTradeResult
{
uint retcode; // Код результата операцииulong deal; // Тикет сделки, если она совершенаulong order; // Тикет ордера, если он выставленdouble volume; // Объем сделки, подтверждённый брокеромdouble price; // Цена в сделке, подтверждённая брокеромdouble bid; // Текущая рыночная цена предложения (цены реквота)double ask; // Текущая рыночная цена спроса (цены реквота)string comment; // Комментарий брокера к операции (по умолчанию заполняется расшифровкой кода возврата торгового сервера)uint request_id; // Идентификатор запроса, устанавливается терминалом при отправке uint retcode_external; // Код ответа внешней торговой системы
};
Donc obtenir le statut de cette commande. Si le ticket est connu.
La transaction a échoué, le prix d'exécution est de 0.
C'est ça le problème : c'est passé. Lorsque le script se termine, une ou deux positions sont laissées en suspens (en fonction du nombre d'imprimantes que vous insérez dans le code).
Code :
#define PRINT(A) Print(#A + " = " + (string)(A))
#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!OrdersTotal())
{
printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
PRINT(Trade.ResultRetcodeDescription());
PRINT(Trade.ResultDeal());
PRINT(Trade.ResultOrder());
PRINT(Trade.ResultComment());
if (OrderSelect(Trade.ResultOrder()))
PRINT(OrderGetInteger(ORDER_STATE));
printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
Résultat :
2021.05.0514:25:14.738 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0514:25:14.821 Test (EURUSD,M1) Trade.ResultRetcodeDescription() = done at 0.000002021.05.0514:25:14.821 Test (EURUSD,M1) Trade.ResultDeal() = 02021.05.0514:25:14.821 Test (EURUSD,M1) Trade.ResultOrder() = 22498886812021.05.0514:25:14.821 Test (EURUSD,M1) Trade.ResultComment() = Request executed
2021.05.0514:25:14.821 Test (EURUSD,M1) EnumToString(ENUM_ORDER_STATE(OrderGetInteger(ORDER_STATE))) = ORDER_STATE_PLACED2021.05.0514:25:14.821 Test (EURUSD,M1) После открытия. PositionsTotal: 1, OrdersTotal: 12021.05.0514:25:14.899 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0514:25:14.899 Test (EURUSD,M1) Выход. PostionsTotal: 2
Je ne sais pas quel genre de scalping fonctionne si fort que vous ne pouvez pas fermer une position à temps...
Tout est dans le temps là-bas. Il s'agit simplement d'une caractéristique architecturale de MT5.
Si vous le voulez bien, essayez d'ajouter la vérification du nombre de positions
Cette vérification est présente dans le code source.
Je pense que les deux positions sont ouvertes et fermées. Cela ne ferait pas de mal d'essayer d'obtenir les types de ces deux postes. S'ils sont dirigés différemment, cela confirmerait mes soupçons...
cela fonctionne bien - (en fonction de quel objectif !?)
qui fonctionne bien - (en fonction de quel objectif !?)
Ne vous impliquez pas. Ils ont un DC spécial qui construit toutes sortes d'intrigues pour attraper les MT bugs.
Un DC spécial qui construit toutes sortes d'intrigues pour attraper les MT bugs.
La plupart des courtiers travaillent selon le même schéma : Result.deal == 0.
Par exemple, Signals est le courtier le plus populaire pour le scalping.
Parmi les courtiers réputés, il est assez difficile de trouver un MT5 qui fonctionne selon un schéma différent.
cela fonctionne bien - (selon le but recherché !?)
La plupart des courtiers travaillent selon le même schéma : Result.deal == 0.
Signals, par exemple, est le courtier le plus populaire pour le scalping.
Parmi les courtiers connus, il est assez difficile de trouver un MT5 qui fonctionne selon un schéma différent.
Je ne sais pas quel type de scalping fonctionne à tel point que vous n'avez pas le temps de fermer une position...
Si cela ne vous dérange pas, essayez quand même d'ajouter la vérification du nombre de positions
Je pense que les deux positions sont ouvertes et fermées. Cela ne ferait pas de mal d'essayer d'obtenir les types de ces deux positions. S'ils sont dirigés différemment, cela confirmera mes soupçons...
C'est fait :
Résultat :
Obtenez le statut de cette commande. Si le ticket est connu.
La transaction a échoué, le prix d'exécution est de 0.
Structure du résultat de la demande de transaction (MqlTradeResult)
En réponse à une demande de transaction, le serveur de transaction renvoie des données contenant le résultat du traitement de la demande de transaction sous la forme d'une structure prédéfinie spéciale MqlTradeResult.
Donc obtenir le statut de cette commande. Si le ticket est connu.
La transaction a échoué, le prix d'exécution est de 0.
C'est ça le problème : c'est passé. Lorsque le script se termine, une ou deux positions sont laissées en suspens (en fonction du nombre d'imprimantes que vous insérez dans le code).
Code :
Résultat :
Je ne sais pas quel genre de scalping fonctionne si fort que vous ne pouvez pas fermer une position à temps...
Tout est dans le temps là-bas. Il s'agit simplement d'une caractéristique architecturale de MT5.
Si vous le voulez bien, essayez d'ajouter la vérification du nombre de positions
Cette vérification est présente dans le code source.
Je pense que les deux positions sont ouvertes et fermées. Cela ne ferait pas de mal d'essayer d'obtenir les types de ces deux postes. S'ils sont dirigés différemment, cela confirmerait mes soupçons...
Il n'existe pas de position de fermeture.
Je n'ai pas encore eu le temps de le poster. Je le posterai dans les 24 heures.
Ça n'a pas marché, j'ai trouvé des problèmes.
Ça n'a pas marché, j'ai trouvé des problèmes.
J'ai hâte d'y être. Si vous avez besoin d'aide pour quoi que ce soit, écrivez-nous.