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

 
Mihail Matkovskij #:

Mais ce n'est pas le cas. Vous devez garder la trace du résultat de

ou votre nouvelle fonction dans OnTradeTransaction. Et s'il n'y a pas de postes, vous devez entrer. Ou écrire le signal dans buySignal ousellSignal et le traiter dans OnTimer comme je l'ai montré dans l'exemple.

ClosePosWithMaxProfitInCurrency

Cette fonction n'est plus pertinente. Il ne convient pas. A la place, nous devons substituer la fonction qui fermera un ordre ouvert en premier, si elle existe.

Je ne comprends pas les variables buySignal etsellSignal écrites sur la portée globale. Mais lorsque j'essaie de le compiler, il me donne l'erreur suivante

'sellSignal' - some operator expected   

expression has no effect        

'buySignal' - some operator expected    

expression has no effect        



 

Bon après-midi.

J'ai certainement lu tout cela, et je peux écrire chaque ordre séparément, mais la question était de raccourcir le code.

 
Bonjour, chers collègues, pourriez-vous conseiller un débutant sur la façon d'obtenir la valeur actuelle (au moment même) de l'indicateur, et non de la barre précédente ? Le conseiller expert ne se déclenche que lorsque la barre précédente se termine, et j'en ai besoin plus tôt.
 
makssub #:

Bon après-midi.

J'ai certainement lu tout cela, et je peux écrire chaque ordre séparément, mais la question était de raccourcir le code.

Pourquoi le raccourcissement du code ne fonctionne pas exactement ?

 
Shockeir #:
Bonjour Collègues, pourriez-vous s'il vous plaît conseiller un novice sur la façon d'obtenir la valeur actuelle (au moment même) d'un indicateur et non la valeur de la barre précédente ? L'EA ne se déclenche que lorsque la barre précédente se termine, et j'en ai besoin avant cela.

Une description plus détaillée de la situation et de ce qui ne fonctionne pas pour vous serait peut-être plus utile.

 
Andrey Sokolov #:

Une description plus détaillée de la situation et de ce que vous êtes vous-même incapable de faire donnera peut-être plus de résultats.

L'indicateur est un stochastique standard. Le conseiller expert doit se déclencher à l'intersection des lignes K et D. Au passage, jusqu'à ce qu'une nouvelle barre apparaisse, rien ne se passe. Lorsqu'une nouvelle barre apparaît, si la condition est toujours remplie, l'action se produit. D'après ce que je comprends, c'est parce que la dernière valeur dans les tampons de l'indicateur est la valeur calculée à la dernière barre complétée. Je voudrais donc que le déclenchement ait lieu sur une barre non finie.

 
Shockeir #:

L'indicateur est un stochastique standard. Le conseiller expert doit être déclenché à l'intersection des lignes K et D. Au croisement, jusqu'à ce qu'une nouvelle barre apparaisse, rien ne se passe. Dès qu'une nouvelle barre apparaît, si la condition est toujours remplie, l'action se produit. D'après ce que je comprends, c'est parce que la dernière valeur dans les tampons de l'indicateur est la valeur calculée à la dernière barre terminée. Je voudrais donc que l'action soit déclenchée sur une barre non terminée.

La dernière bougie a un indice de 0.

Alors, comment avez-vous essayé de résoudre ce problème ? Avez-vous lu l'aide ? Qu'est-ce qui ne fonctionne pas exactement ?

 
Andrey Sokolov #:

Pouvez-vous mettre le code ? Indiquez au moins clairement la langue que vous utilisez.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//--- input parameters
input double   crossDepthOpen=7;    //Глубина пересечения K и D для открытия
input double   crossDepthClose=-2;  //Глубина пересечения K и D для закрытия
input double   closeCoef=5;         //Коэффициент изменения глубины закрытия
input int      k_period=8;          //Период K
input int      d_period=3;          //Период В
input int      slowing=3;           //Сглаживание
input double   tp_1=20;             //Тейк
input double   sl_1=60;             //Лосс
input double   maxPos=2.0;          //Размер лота

int      stoch_handle;
double   k_buffer[1];
double   d_buffer[1];
double   TKP;
double   STL;
double   CDO;
double   CDC;
int      lossCount=0;
int      profitCount=0;
int      EA_magic=12345;


//| Expert initialization function

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   TKP=tp_1;
   STL=sl_1;

   stoch_handle=iStochastic(_Symbol,PERIOD_CURRENT,k_period,d_period,slowing,MODE_EMA,STO_LOWHIGH);
   if(stoch_handle<0)
     {
      Alert("Ошибка при создании индикаторов ",GetLastError());
      return(0);
     }
   return(INIT_SUCCEEDED);
  }

//| Expert tick function

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   CDO=crossDepthOpen;
   CDC=crossDepthClose;
   MqlTick latestPrice;
   MqlTradeResult mResult;
   MqlTradeRequest mRequest;
   ZeroMemory(mRequest);
   SymbolInfoTick(_Symbol,latestPrice);
   ArraySetAsSeries(k_buffer,true);
   ArraySetAsSeries(d_buffer,true);
   if(CopyBuffer(stoch_handle,0,0,1,k_buffer)<0)
     {
      Alert("Не удалось скопировать в буфер K",GetLastError());
      return;
     }
   if(CopyBuffer(stoch_handle,1,0,1,d_buffer)<0)
     {
      Alert("Не удалось скопировать в буфер D",GetLastError());
      return;
     }

   bool buyFullOpened=false;
   bool buyPartOpened=false;
   bool sellFullOpened=false;
   bool sellPartOpened=false;

//Состояние позиций
   if(PositionSelect(_Symbol)==true)
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         if(PositionGetDouble(POSITION_VOLUME)>=maxPos)
           {
            buyFullOpened=true;
           }
         else
           {
            buyPartOpened=true;
           }
        }
      else
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
           {

            if(PositionGetDouble(POSITION_VOLUME)>=maxPos)
              {
               sellFullOpened=true;
              }
            else
              {
               sellPartOpened=true;
              }
           }
     }
//состояние позиций конец

//Условия изменения позиций
   bool buyOpenCondition=k_buffer[0]>((d_buffer[0])+CDO);
   bool buyCloseCondition=k_buffer[0]<((d_buffer[0])-CDC);
   bool buyTPCondition=latestPrice.bid>(PositionGetDouble(POSITION_PRICE_OPEN)+TKP*_Point);
   bool buySLCondition=latestPrice.bid<(PositionGetDouble(POSITION_PRICE_OPEN)-STL*_Point);
   bool sellOpenCondition=k_buffer[0]<((d_buffer[0])-CDO);
   bool sellCloseCondition=k_buffer[0]>((d_buffer[0])+CDC);
   bool sellTPCondition=latestPrice.ask<(PositionGetDouble(POSITION_PRICE_OPEN)-TKP*_Point);
   bool sellSLCondition=latestPrice.ask>(PositionGetDouble(POSITION_PRICE_OPEN)+STL*_Point);
//Условия изменения позиций конец

//Проверка и выполнение действий
   if(buyOpenCondition)
     {
      if(!buyFullOpened && !buyPartOpened && !sellPartOpened && !sellFullOpened)
        {
         Print("Покупка по сигналу");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.ask,_Digits);
         mRequest.sl = 0; //NormalizeDouble(latestPrice.ask - STL*Point(),_Digits);
         mRequest.tp = 0; //NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = maxPos;
         OrderSend(mRequest,mResult);
         Print("Открыто ",PositionGetDouble(POSITION_VOLUME)," по ", PositionGetDouble(POSITION_PRICE_OPEN));
        }
     }
//Условия покупки
   if(sellTPCondition)
     {
      if(sellFullOpened)
        {
         Print("Тейк-профит шорта");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.ask,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = MathRound(PositionGetDouble(POSITION_VOLUME)/2);
         OrderSend(mRequest,mResult);
         ++profitCount;
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }

   if(sellSLCondition)
     {
      if(sellFullOpened || sellPartOpened)
        {
         Print("Стоп-лосс шорта");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.ask,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = PositionGetDouble(POSITION_VOLUME);
         OrderSend(mRequest,mResult);
         ++lossCount;
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }

   if(sellCloseCondition)
     {
      if(sellFullOpened || sellPartOpened)
        {
         Print("Закрытие шорта по сигналу");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         Print(k_buffer[0]," ",d_buffer[0]);
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.ask,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = PositionGetDouble(POSITION_VOLUME);
         OrderSend(mRequest,mResult);
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }

//Условия продажи
   if(sellOpenCondition)
     {
      if(!sellFullOpened && !buyPartOpened && !sellPartOpened && !buyFullOpened)
        {
         Print("Продажа по сигналу");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         Print(k_buffer[0]," ",d_buffer[0]);
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.bid,_Digits);
         mRequest.sl = 0; //NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0; //NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = maxPos;
         OrderSend(mRequest,mResult);
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }
   if(buyTPCondition)
     {
      if(buyFullOpened)
        {
         Print("Тейк-профит лонга");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.bid,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = MathRound(PositionGetDouble(POSITION_VOLUME)/2);
         OrderSend(mRequest,mResult);
         ++profitCount;
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }

   if(buySLCondition)
     {
      if(buyFullOpened || buyPartOpened)
        {
         Print("Стоп-лосс лонга");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         Print(k_buffer[0]," ",d_buffer[0]);
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.bid,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = PositionGetDouble(POSITION_VOLUME);
         OrderSend(mRequest,mResult);
         ++lossCount;
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }

   if(buyCloseCondition)
     {
      if(buyFullOpened || buyPartOpened)
        {
         Print("Закрытие лонга по сигналу");
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
         Print("Цена открытия ", PositionGetDouble(POSITION_PRICE_OPEN));
         Print(k_buffer[0]," ",d_buffer[0]);
         mRequest.action = TRADE_ACTION_DEAL;
         mRequest.symbol = _Symbol;
         mRequest.price = NormalizeDouble(latestPrice.bid,_Digits);
         mRequest.sl = 0;//NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0;//NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL;
         mRequest.type_filling = ORDER_FILLING_FOK;
         mRequest.deviation=100;
         mRequest.volume = PositionGetDouble(POSITION_VOLUME);
         OrderSend(mRequest,mResult);
         Print("Текущий объем позиций ",PositionGetDouble(POSITION_VOLUME));
        }
     }
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   IndicatorRelease(stoch_handle);
   Print("loss ",lossCount);
   Print("profit ",profitCount);
  }
//+------------------------------------------------------------------+
Andrey Sokolov #:

Pouvez-vous mettre le code ? Au moins, indiquez clairement dans quelle langue vous le faites.

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Toutes les questions des débutants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes.

GlaVredFX, 2022.01.17 22:52

ClosePosWithMaxProfitInCurrency

Vous ne devez plus utiliser cette fonction. Ce n'est pas pertinent. Si cette fonction existe, elle doit être remplacée par une fonction qui fermera le premier ordre ouvert.

Je ne comprends pas les variables buySignal etsellSignal prescrites au niveau global. Mais lorsque j'essaie de le compiler, il me donne l'erreur suivante

'sellSignal' - some operator expected   

expression has no effect        

'buySignal' - some operator expected    

expression has no effect        



Comment les avez-vous enregistrés et où le compilateur intervient-il ? Je ne peux pas deviner. Vous avez besoin du code source pour le comprendre.
 
Shockeir #:
Bonjour chers collègues, pouvez-vous s'il vous plaît conseiller un débutant sur la façon d'obtenir la valeur actuelle (au moment même) de l'indicateur, et non la valeur de la barre précédente? L'EA ne se déclenche que lorsque la barre précédente se termine, et j'en ai besoin plus tôt.

Les tableaux k_buffer[0] et d_buffer[0] contiennent les dernières valeurs des indicateurs. Quel est le problème de les sortir et de les voir soi-même ?

Raison: