Cette méthode de calcul du swap est appelée rollover. Vous ne pouvez pas le savoir de manière programmatique dans MT4. Seulement indirectement après le changement de minuit des ordres du marché du travail. Il y a beaucoup de petits problèmes de ce genre, mais plutôt désagréables, dans MT4. Dans MT5, il y en a un peu moins, mais ils existent toujours.
Ce sont les valeurs de swap en pips. Ils doivent être convertis dans la devise du dépôt, en fonction du volume de l'ordre de marché. On obtient alors la taille réelle du swap.
"Il n'y a aucun moyen de le découvrir par programme dans MT4". - Merci pour votre temps et vos réponses.
Bonjour, chers utilisateurs du forum, aidez-moi à comprendre l'algorithme. L'objectif est de déterminer la fourchette de prix dans la période de temps spécifiée et de fixer les stops d'achat et de vente au maximum et au minimum. Les stoploss sont fixés sur des ordres opposés, TakeProfit doit être égal à StopLoss*2.
Ensuite, après chaque fermeture par Stop Loss, l'ordre est restauré avec les mêmes Stop Loss et Take Profit que celui qui a été fermé et le cycle complet est achevé dès qu'un des ordres est fermé par Take Profit. Et dès le début, nous définissons la gamme et nous y allons.
Mais maintenant, il ne place pas le TP ou plutôt il le place au prix d'ouverture et le stop loss n'est pas sur la taille de la fourchette, c'est-à-dire pas sur un ordre de sens contraire. Merci d'avance pour votre aide.
staticint prevtime = 0;
int MagicNumber = 12345678;
inputint stoploss = 40;
inputint takeprofit = 50;
inputint padding = 5;
int a=1;
inputstring startTime = "14:35";
inputstring endTime = "18:35";
int expertBars;
double max, min;
bool isEndTime = true;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//sendOrders();return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+#include <expert.mq4>
int start()
{
//Возвращает максимум и минимум за промежутокif(isTime()) getMaxMin();
// всё, что задается ниже - будет работать по "ценам открытия"//нового бара, т.е. будет срабатывать в момент его появления//на том графике, на кот. стоит советник
CheckEvents( MagicNumber );
if ( eventBuyClosed_SL > 0 ) {
Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по СтопЛоссу!" );
double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Минимальный стоп левел: ", minstoplevel);
OrderSend(_Symbol,OP_BUYSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrGreen);
}
if ( eventBuyClosed_TP > 0 ) {
Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по ТейкПрофиту!" );
deleteAllPaddingOrders();
}
if ( eventSellClosed_SL > 0 ) {
Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по СтопЛоссу!" );
double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Минимальный стоп левел: ", minstoplevel);
OrderSend(_Symbol,OP_SELLSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrRed);
}
if ( eventSellClosed_TP > 0 ) {
Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по ТейкПрофиту!" );
deleteAllPaddingOrders();
}
if ( eventBuyLimitOpened > 0 || eventBuyStopOpened > 0 ||
eventSellLimitOpened > 0 || eventSellStopOpened > 0 )
Alert( _Symbol, OrderType(), ": сработал отложенный ордер!" );
return(0);
}
//-----------------------------------------------------------------+void deleteAllPaddingOrders() {
int total = OrdersTotal();
for(int i=total-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS);
int type = OrderType();
if (OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() != _Symbol) continue;
bool result = false;
switch(type)
{
//Close opened long positionscaseOP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
break;
//Close opened short positionscaseOP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
// break;//Close pending orders//case OP_BUYLIMIT ://case OP_SELLLIMIT :caseOP_BUYSTOP :
caseOP_SELLSTOP : result = OrderDelete( OrderTicket() );
}
if(result == false)
{
Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
Sleep(3000);
}
return;
}
return;
}
void sendOrders(bool isFirst) {
//--- получим минимальное значение Stop leveldouble minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Print("Minimum Stop Level=",minstoplevel," points");
//--- BUYSTOP//--- вычисленные значения цен SL и TP должны быть нормализованы//--- размещаем рыночный ордер на покупку 1 лотаint ticketBuyStop, ticketSellStop;
if(!isFirst) {
ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,Ask + padding * Point,20,Bid -padding*Point,Ask + padding * Point,"My order",MagicNumber,0,clrGreen);
ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,Bid - padding * Point,20,Ask + padding*Point,Bid - padding * Point,"My order",MagicNumber,0,clrRed);
} else {
ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,max + padding * Point,20,min -padding*Point,max + (max - min + padding) * Point,"My order",MagicNumber,0,clrGreen);
ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,min - padding * Point,20,max + padding*Point,min - (max - min + padding)*Point,"My order",MagicNumber,0,clrRed);
}
if(ticketBuyStop<0)
{
Print("OrderSend завершилась с ошибкой #",GetLastError());
deleteAllPaddingOrders();
if(a <=5) {
//sendOrders(isFirst);
a= a+1;
}
}
elsePrint("Функция OrderSend успешно выполнена");
//---BUYSTOP//---SELLSTOP//--- вычисленные значения цен SL и TP должны быть нормализованы//--- размещаем рыночный ордер на покупку 1 лотаif(ticketSellStop<0)
{
deleteAllPaddingOrders();
if(a <= 5) {
//sendOrders();
a= a+1;
Print("a", a);
}
Print("OrderSend завершилась с ошибкой #",GetLastError());
}
elsePrint("Функция OrderSend успешно выполнена");
//---SELLSTOPreturn;
}
bool getMaxMin() {
int startIndex = iBarShift(_Symbol, 0, StrToTime(startTime), true);
min=iLow(NULL,0,iLowest(NULL,0,MODE_LOW,startIndex,0));
max=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,startIndex,0));
Alert("Min: ", min);
Alert("Max: ", max);
sendOrders(true);
returntrue;
}
//===============================================================================+//======| возвращает true если временной диапозон кончился |//===============================================================================+bool isTime() {
if (TimeHour(StrToTime(startTime)) == Hour() && TimeMinute(StrToTime(startTime)) == Minute() && isEndTime) { Alert("Start Timeline"); isEndTime = false; deleteAllPaddingOrders();};
if(TimeHour(StrToTime(endTime)) == Hour() && TimeMinute(StrToTime(endTime)) <= Minute() && !isEndTime) { Alert("End Timeline"); isEndTime = true; returntrue;};
returnfalse;
}
//=====================================================================+//======| возвращает true если появился новый бар, иначе false |//=====================================================================+//bool isNewBar()//{//bool res=false;//if(expertBars!=iBars(Symbol(),0))//{//expertBars=iBars( Symbol (),0);//res=true;//}//return(res);//}
Lorsque je teste dans le journal, j'obtiens l'erreur OrderSend 130 - si je comprends bien, cela ne peut être lié qu'aux arrêts ou aux coups, veuillez vérifier ce qui ne va pas :
#define MagicNumber1 100//Buyinputdouble MaximumRisk=0.03; //Max риск в сделке
input double K=1; //Коэффициент риск к прибыли
inputint OrderPoint=30; //Расстояние до отложенного ордераdouble Price=0; //Цена для установки отложенного ордераdouble SL=0; //Stop Lossdouble TP=0; //Take Profitdouble Lots=0; //Просчет лотности исходя из max риска одной сделкиvoidOnTick()
{
//Параметры для открытия ордера
Price = NormalizeDouble(High[1]+OrderPoint*Point,Digits); //Цена открытия ордера
SL = NormalizeDouble(Low[1]-Point,Digits); //Стоп лоссif ((Price-SL)<NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits))
{SL=Price-NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);}
TP = NormalizeDouble((Price-SL)*K+Price,Digits); //Тэйк профит//Просчет лотности исходя из риска в сделке
Lots = NormalizeDouble(((AccountBalance()*MaximumRisk/100.0)/((Price-SL)*1000.0)),1);
//Установка отложенного ордераbool send1=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price,3,SL,TP,"comment",MagicNumber1,0,clrGreen);
}
Lors du test, dans le journal, il y a une erreur OrderSend error 130 - si je comprends bien, elle ne peut être liée qu'à des arrêts ou des coups,
Les prix ouverts des ordres en cours sont également affectés. C'est pourquoi nous devons vérifier la distance entre le prix actuel du marché et le prix d'ouverture de l'ordre. Dans ce cas : Prix - Demander.
Le prix d'ouverture des ordres en attente s'applique également. Par conséquent, nous devons également vérifier la distance entre le prix actuel du marché et le prix d'ouverture de l'ordre. Dans ce cas : Prix - Demander.
C'est un peu compliqué pour moi. Pourriez-vous expliquer dans quelle partie du code il faut ajouter et ce que signifient mn et mag_n ? Où dois-je mettre mon EA medjic ici ?
Cette méthode de calcul du swap est appelée rollover. Vous ne pouvez pas le savoir de manière programmatique dans MT4. Seulement indirectement après le changement de minuit des ordres du marché du travail. Il y a beaucoup de petits problèmes de ce genre, mais plutôt désagréables, dans MT4. Dans MT5, il y en a un peu moins, mais ils existent toujours.
Ce sont les valeurs de swap en pips. Ils doivent être convertis dans la devise du dépôt, en fonction du volume de l'ordre de marché. On obtient alors la taille réelle du swap.
"Il n'y a aucun moyen de le découvrir par programme dans MT4". - Merci pour votre temps et vos réponses.
Bonjour, chers utilisateurs du forum, aidez-moi à comprendre l'algorithme. L'objectif est de déterminer la fourchette de prix dans la période de temps spécifiée et de fixer les stops d'achat et de vente au maximum et au minimum. Les stoploss sont fixés sur des ordres opposés, TakeProfit doit être égal à StopLoss*2.
Ensuite, après chaque fermeture par Stop Loss, l'ordre est restauré avec les mêmes Stop Loss et Take Profit que celui qui a été fermé et le cycle complet est achevé dès qu'un des ordres est fermé par Take Profit. Et dès le début, nous définissons la gamme et nous y allons.
Mais maintenant, il ne place pas le TP ou plutôt il le place au prix d'ouverture et le stop loss n'est pas sur la taille de la fourchette, c'est-à-dire pas sur un ordre de sens contraire. Merci d'avance pour votre aide.
Il n'est pas nécessaire de dupliquer les questions dans différents fils de discussion.
Bonjour !
Lorsque je teste dans le journal, j'obtiens l'erreur OrderSend 130 - si je comprends bien, cela ne peut être lié qu'aux arrêts ou aux coups, veuillez vérifier ce qui ne va pas :
Bonjour !
Lors du test, dans le journal, il y a une erreur OrderSend error 130 - si je comprends bien, elle ne peut être liée qu'à des arrêts ou des coups,
Les prix ouverts des ordres en cours sont également affectés. C'est pourquoi nous devons vérifier la distance entre le prix actuel du marché et le prix d'ouverture de l'ordre. Dans ce cas : Prix - Demander.
Le prix d'ouverture des ordres en attente s'applique également. Par conséquent, nous devons également vérifier la distance entre le prix actuel du marché et le prix d'ouverture de l'ordre. Dans ce cas : Prix - Demander.
Que retourne la fonction Hour() ?
Renvoie l'heure actuelle. C'est ainsi que je travaille : si l'heure actuelle est supérieure à 11 et inférieure à 17,
mais comment ?
C'est un peu compliqué pour moi. Pourriez-vous expliquer dans quelle partie du code il faut ajouter et ce que signifient mn et mag_n ? Où dois-je mettre mon EA medjic ici ?
Avant que votre condition ne mette
mag_n - où dois-je mettre l'IG de mon EA ici ?
J'écris : si l'heure actuelle est supérieure à 11 et inférieure à 17, comment doit-elle être ?
Je comprends que la question porte sur l'indicateur. Au lieu deHour() -> time[i]
Je comprends que la question porte sur l'indicateur. Au lieu deHour() -> time[i].
Oui, vous l'avez aidé, maintenant je veux limiter le temps. Ne pas compter de 17h00 à 23h00.