Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 32

Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Voilà, c'est différent, maintenant on sait clairement à quoi se rapporte le 1% ;)
Le Conseiller Expert prend en compte les valeurs min et max des X dernières barres et place les ordres en fonction de celles-ci. Ensuite, lorsque le maximum ou le minimum est diminué, vous devez supprimer l'ordre correspondant et l'ouvrir par de nouvelles données.
Je n'ai pas compris exactement quand vous modifiez les pauses, mais j'ai fait en sorte que si le prix minimum est supérieur au prix de réglage existant de la BuyLimit, alors vous devez le modifier au nouveau prix Min.
Pour SellLimit - en miroir.
J'ai seulement écrit le code, mais je ne l'ai pas du tout vérifié - je vous laisse le soin de modifier et de vérifier l'exactitude de l'algorithme et du code en général.
input double LotB=0.1; // Лот Buy
input double LotS=0.1; // Лот Sell
input int Pointsl=100; // StopLoss в пунктах
input int Pointtp=100; // TakeProfit в пунктах
input int NumBars=10; // Количество баров для поиска Max/Min
input int Magic=100500; // Magic
//--- global variables
struct DataPendingOrder
{
int number; // Количество
double price_set; // Цена установки
};
struct DataPending
{
DataPendingOrder buy_limit; // BuyLimit
DataPendingOrder buy_stop; // BuyStop
DataPendingOrder sell_limit; // SellLimit
DataPendingOrder sell_stop; // SellStop
};
struct DataOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
DataPending order; // Данные отложенного ордера
};
DataOrders getData; // Данные ордеров и позиций
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
pointsl=(Pointsl<0?0:Pointsl);
pointtp=(Pointtp<0?0:Pointtp);
double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders(Symbol(),Magic,getData);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice=0.0, minPrice=DBL_MAX;
for(int i=0; i<numBars; i++) {
double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
if(max_i>maxPrice) maxPrice=max_i;
double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
if(min_i<minPrice) minPrice=min_i;
}
//--- если нету рыночных Buy
if(getData.buy==0) {
//--- если нет отложенного BuyLimit
if(getData.order.buy_limit.number==0) {
double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
ResetLastError();
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError());
else Print("OP_BUYLIMIT OK");
}
//--- если есть BuyLimit
else {
//--- если цена Min больше цены установки BuyLimit
if(minPrice>getData.order.buy_limit.price_set) {
// модифицировать BuyLimit - поставить его на цену minPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//--- если нету рыночных Sell
if(getData.sell==0) {
//--- если нет отложенного SellLimit
if(getData.order.sell_limit.number==0) {
double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
ResetLastError();
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError());
else Print("OP_SELLLIMIT OK");
}
//--- если есть SellLimit
else {
//--- если цена Max меньше цены установки SellLimit
if(maxPrice<getData.order.sell_limit.price_set) {
// модифицировать SellLimit - поставить его на цену maxPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//---
string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataOrders &data_of) {
ZeroMemory(data_of);
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
//--- рыночные позиции
if(OrderType()==OP_BUY) data_of.buy++;
if(OrderType()==OP_SELL) data_of.sell++;
//--- отложенные ордера
if(OrderType()==OP_BUYLIMIT) { data_of.order.buy_limit.number++; data_of.order.buy_limit.price_set=OrderOpenPrice(); }
if(OrderType()==OP_BUYSTOP) { data_of.order.buy_stop.number++; data_of.order.buy_stop.price_set=OrderOpenPrice(); }
if(OrderType()==OP_SELLLIMIT) { data_of.order.sell_limit.number++; data_of.order.sell_limit.price_set=OrderOpenPrice(); }
if(OrderType()==OP_SELLSTOP) { data_of.order.sell_stop.number++; data_of.order.sell_stop.price_set=OrderOpenPrice(); }
}
}
}
//+------------------------------------------------------------------+
J'espère que vous trouverez la solution
Pourquoi supprimer quand on peut modifier le prix de fixation et le stop et le takeout par rapport au nouveau niveau ?
Je viens de commencer mes études et l'option de suppression consistait à étudier l'application de la fonction, je me suis demandé pourquoi cela ne fonctionnait pas.
Merci à tous pour vos commentaires.
Quelqu'un veut savoir à quoi doit ressembler la commande de réinitialisation externe ?
à quoi cela devrait ressembler
1) Sélectionnez dans la liste un ensemble de conditions requises pour le déclenchement de la commande, par exemple l'ouverture d'un ordre.
2) L'ordre est ouvert et la commande ne fonctionne pas dans d'autres conditions. Le filtrage par ticket et par quantité de commande n'est pas une option puisque le principe lui-même doit être réparti dans toute la liste.
si (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) Quelle est l'erreur ici si GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] utilise l'intersection mobile + filtre par distance après l'intersection mobile. Quelle est la précision de cette condition ?
Ce queGrossMA1 etGrossMA2 vous renvoient, il y a très probablement une différence, vous obtenez quelque chose comme ceci
MA1= 1,0050
if (MA1 > 0.0052) // ce n'est pas le prix lui-même mais sa différence, donc ce n'est pas une comparaison incorrecte
Ce queGrossMA1 etGrossMA2 vous retournent, il y a probablement une différence là, vous vous retrouvez avec quelque chose comme ceci
MA1= 1,0050
if (MA1 > 0.0052) // ce n'est pas le prix lui-même, mais sa différence, donc c'est une comparaison incorrecte
Ce queGrossMA1 etGrossMA2 vous renvoient, il y a très probablement une différence ici, vous obtenez quelque chose comme ceci
MA1= 1,0050
if (MA1 > 0.0052) // ce n'est pas le prix lui-même, mais sa différence, donc c'est une comparaison incorrecte
FRMA2=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1);
FMA1=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0);
FMA2=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1);
GrossMA1=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0);
GrossMA2=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1);
Ce queGrossMA1 etGrossMA2 vous renvoient, il y a très probablement une différence, vous obtenez quelque chose comme ceci
MA1= 1,0050
if (MA1 > 0.0052) // ce n'est pas le prix lui-même, mais sa différence, donc c'est une comparaison incorrecte
Bien. Pouvez-vous me dire où se trouve l'erreur ?
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10; extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
Tout fonctionne, passe une commande au prix de maxpr1.
Ensuite, je veux faire la même chose, mais au prix minpr1 :
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
Erreur 130 (arrêts erronés). Qu'est-ce que je fais de mal ?