C'est ici que j'ai eu la partie délicate : j'ai pris ce code (merci à Alekseu Fedotov) :
//+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара закрытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { datetime t; int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) t=OrderCloseTime(); } } } } } } return(iBarShift(sy, tf, t, True)); }
Et maintenant je mets le chèque :
if(УСЛОВИЕ && NumberOfBarCloseLastPos()>0)
Et c'est là que le bât blesse, car initialement NumberOfBarCloseLastPos sera défini à "-1". Et par conséquent, la première commande ne sera jamais ouverte.
Que pouvons-nous faire dans cette situation ? Ou ai-je mal compris quelque chose ?
Dans cette situation, on pourrait essayerif(CONTROL && NumberOfBarCloseLastPos()>-2), ou penser
Petite nuance : j'ai pris ce code (merci à Alekseu Fedotov) :
//+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара закрытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { ... return(iBarShift(sy, tf, t, True)); }
C'est ici que je me suis un peu compliqué la vie : j'ai pris ce code (merci à Alekseu Fedotov) :
//+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара закрытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { datetime t; int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) t=OrderCloseTime(); } } } } } } return(iBarShift(sy, tf, t, True)); }
Et maintenant je mets le chèque :
if(УСЛОВИЕ && NumberOfBarCloseLastPos()>0)
Et c'est là que le bât blesse, car initialement NumberOfBarCloseLastPos sera défini à "-1". Et par conséquent, la première commande ne sera jamais ouverte.
Que peut-on faire dans cette situation ? Ou ai-je mal compris quelque chose ?
Eh bien, c'est ce que je ferais :
//+------------------------------------------------------------------+ int BarCloseLastPos(string symbol_name, ENUM_TIMEFRAMES timeframe, int type, int magic_number) { datetime time=0; int j=-1; for(int i=OrdersHistoryTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if(OrderMagicNumber()!=magic_number) continue; if(OrderSymbol()!=symbol_name) continue; if(OrderType()!=type) continue; if(OrderCloseTime()>time) { time=OrderCloseTime(); j=i; } } } if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) return(iBarShift(symbol_name,timeframe,time)); return(EMPTY); } //+------------------------------------------------------------------+
... et vérifier :
if(BarCloseLastPos(Symbol(),PERIOD_CURRENT,OP_BUY,Magic)>0) { // Последняя позиция Buy была закрыта не на текущем баре }
C'est ici que je me suis un peu compliqué la vie : j'ai pris ce code (merci à Alekseu Fedotov) :
//+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара закрытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { datetime t; int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) t=OrderCloseTime(); } } } } } } return(iBarShift(sy, tf, t, True)); }
Et maintenant je mets le chèque :
if(УСЛОВИЕ && NumberOfBarCloseLastPos()>0)
Et c'est là que le bât blesse, car initialement NumberOfBarCloseLastPos sera défini à "-1". Et par conséquent, la première commande ne sera jamais ouverte.
Que pouvons-nous faire dans cette situation ? Ou ai-je mal compris quelque chose ?
Bonjour aux utilisateurs du forum MT4 ! J'ai rencontré un problème et je pense que soit je ne sais pas comment calculer et beaucoup de calculatrices ou le compilateur MT4 a sa propre façon. J'écris le code print((1.1145-1.1123-0.0020)/0.0001) devrait obtenir 2.J'ai essayé d'imprimer((OrdArr[i].buy-Ord[1,3]-PipStep)/Point) pinstep est 0.0020, mais je continue à obtenir seulement un dixième de ce qu'il devrait être. Peut-être que quelqu'un sait quel est le problème ! SPS.
C'est ici que j'ai eu la partie délicate : j'ai pris ce code (merci à Alekseu Fedotov) :
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
Et maintenant je mets le chèque :
Et c'est là que le bât blesse, car initialement NumberOfBarCloseLastPos sera défini à "-1". Et par conséquent, la première commande ne sera jamais ouverte.
Que pouvons-nous faire dans cette situation ? Ou ai-je mal compris quelque chose ?
Petite nuance : j'ai pris ce code (merci à Alekseu Fedotov) :
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
...
return(iBarShift(sy, tf, t, True));
}
Dans cette situation, vous pourriez essayerif(CONDITION && NumberOfBarCloseLastPos()>-2), ou penser à
C'est ici que je me suis un peu compliqué la vie : j'ai pris ce code (merci à Alekseu Fedotov) :
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
Et maintenant je mets le chèque :
Et c'est là que le bât blesse, car initialement NumberOfBarCloseLastPos sera défini à "-1". Et par conséquent, la première commande ne sera jamais ouverte.
Que peut-on faire dans cette situation ? Ou ai-je mal compris quelque chose ?
Eh bien, c'est ce que je ferais :
int BarCloseLastPos(string symbol_name, ENUM_TIMEFRAMES timeframe, int type, int magic_number) {
datetime time=0;
int j=-1;
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
if(OrderType()!=type) continue;
if(OrderCloseTime()>time) {
time=OrderCloseTime();
j=i;
}
}
}
if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) return(iBarShift(symbol_name,timeframe,time));
return(EMPTY);
}
//+------------------------------------------------------------------+
... et vérifier :
// Последняя позиция Buy была закрыта не на текущем баре
}
Eh bien, c'est ce que je ferais :
int BarCloseLastPos(string symbol_name, ENUM_TIMEFRAMES timeframe, int type, int magic_number) {
datetime time=0;
int j=-1;
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
if(OrderType()!=type) continue;
if(OrderCloseTime()>time) {
time=OrderCloseTime();
j=i;
}
}
}
if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) return(iBarShift(symbol_name,timeframe,time));
return(EMPTY);
}
//+------------------------------------------------------------------+
... et vérifier :
// Последняя позиция Buy была закрыта не на текущем баре
}
Et si elle se fermait sournoisement sur la barre actuelle ?
C'est exactement ce qu'il faut manquer. Il n'est pas nécessaire d'ouvrir une position si la précédente a clôturé sur cette barre - sur zéro.
Et si nous devons vérifier la condition que la position a fermé sur la barre actuelle, nous devons vérifier zéro :
// Последняя позиция Buy была закрыта на текущем баре
}
C'est ici que je me suis un peu compliqué la vie : j'ai pris ce code (merci à Alekseu Fedotov) :
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
Et maintenant je mets le chèque :
Et c'est là que le bât blesse, car initialement NumberOfBarCloseLastPos sera défini à "-1". Et par conséquent, la première commande ne sera jamais ouverte.
Que pouvons-nous faire dans cette situation ? Ou ai-je mal compris quelque chose ?