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

 
Taras Slobodyanik #:

Vous devez toujours vérifier les conditions sur chaque nouveau tick, et si cela n'a pas fonctionné sur le tick précédent, cela changera sur le nouveau.

Et la gestion des erreurs doit être faite.

Si vous le faites par le biais d'un tableau, vérifiez uniquement les ticks des ordres modifiés écrits dans ce tableau par rapport à tous les autres.

MakarFX #:
C'est à peu près ça, oui, merci. Dans ce cas, si vous sauvegardez vers des objets, il vaut mieux avoir des majuscules uniques au lieu de tickets, sinon il y aura des dizaines d'objets avec le même nom.

.
StringToInteger(ObjectName(0,i,0)
Une faute de frappe ? Je pense que les deux fonctions ne peuvent prendre qu'un seul paramètre.
 
Документация по MQL5: Графические объекты / ObjectName
Документация по MQL5: Графические объекты / ObjectName
  • www.mql5.com
ObjectName - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nerd Trader #:
Si vous le faites par le biais d'un tableau, alors ne vérifiez que les ticks des ordres modifiés qui y sont écrits par rapport à tous les autres.

C'est à peu près ça, oui, merci. Dans ce cas, si nous sauvegardons vers des objets, il vaut mieux avoir des majuscules uniques au lieu de tickets, sinon il y aura des dizaines d'objets avec le même nom.

Une faute de frappe ? Je pense que les deux fonctions ne peuvent prendre qu'un seul paramètre.

Ils ne le feront pas.

if(ObjectName(i)!=OrderTicket()) ObjectDelete(0,ObjectName(i));

Désolé

StringToInteger(ObjectName( i));
 
 
MakarFX #:

Ils ne le feront pas.

Désolé

À propos, savez-vous pourquoi l'erreur suivante se produit périodiquement ? Pour 100 ordres ouverts avec succès, il y en a environ 10.

2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: 4051 | order.sl_price: 2.813499706815862e-262
2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: OrderSend error 4051
2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: unknown trade cmd 406958564 for OrderSend function

order.sl_price : 2.813499706815862e-262 - prix de la boucle d'arrêt, ce nombre ne devrait clairement pas être.
4051 - "Valeur non valide du paramètre de la fonction"
- s'agit-il du type de commande ? Il ne devrait pas y avoir de problème avec ça non plus.

class Order{
  public:
    double open_price;
    double sl_price;
    double tp_price;
    color  arrow_color;
    string error_text;
    int cmd;

    Order(){};

    void InitForSell(string type = ""){
      if(type == ""){
        Print("Ошибка: 'type' должен иметь значение");
        return;
      }

      sl_price = NormalizeDouble(db_last.hight + (sl_indent*Point), Digits); // (цена + (кол-во пипсов*Point)


      arrow_color = clrRed;

      if(type == "sellstop"){
        open_price = NormalizeDouble(db_last.low - (order_indent*Point), Digits);

        if(tp_size != 0)
          tp_price = NormalizeDouble(db_last.low - (order_indent+tp_size)*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_SELLSTOP;
        error_text = "Ошибка открытия селстопа ";
      }

      if(type == "sell"){
        open_price = Bid;

        if(tp_size != 0)
          tp_price = NormalizeDouble(Bid - tp_size*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_SELL;
        error_text = "Ошибка открытия села ";
      }
    };

    void InitForBuy(string type = ""){
      if(type == ""){
        Print("Ошибка: 'type' должен иметь значение");
        return;
      }

      sl_price = NormalizeDouble(db_last.low - (sl_indent*Point), Digits); // (цена + (кол-во пипсов*Point)


      arrow_color = clrGreen;

      if(type == "buystop"){
        open_price = NormalizeDouble(db_last.hight + (order_indent*Point), Digits);

        if(tp_size != 0)
          tp_price = NormalizeDouble(db_last.hight + (order_indent+tp_size)*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_BUYSTOP;
        error_text = "Ошибка открытия байстопа ";
      }

      if(type == "buy"){
        open_price = Ask;

        if(tp_size != 0)
          tp_price = NormalizeDouble(Bid + tp_size*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_BUY;
        error_text = "Ошибка открытия бая ";
      }
    };

    ~Order(){};
};

//-------------------------------------------

if(...)
  {
    ResetLastError();
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, order.open_price, 1, 
    order.sl_price, order.tp_price, "", 0, 0, order.arrow_color);

    if(order_send == -1) return;
  }
 
MakarFX #:
Voulez-vous dire "min et max" par billet ou par prix ?

Par billet

 
Nerd Trader #:

À propos, savez-vous pourquoi l'erreur suivante se produit périodiquement ? Pour 100 ordres ouverts avec succès, il y en a environ 10.

order.sl_price : 2.813499706815862e-262 - prix stop, clairement ce nombre ne devrait pas être.
4051 - "Valeur invalide du paramètre de fonction"
- s'agit-il du type de commande ? Il ne devrait pas non plus y avoir de problèmes.

Essayez de déplacer "NormalizeDouble".

if(...)
  {
    ResetLastError();
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, NormalizeDouble(order.open_price, Digits), 1, 
    NormalizeDouble(order.sl_price, Digits), NormalizeDouble(order.tp_price, Digits), "", 0, 0, order.arrow_color);

    if(order_send == -1) return;
  }

 
EVGENII SHELIPOV #:

Par billet

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderTicket()== GetTicketMaxMinOrder(0) || OrderTicket()== GetTicketMaxMinOrder(1) ) {
             p=MarketInfo(OrderSymbol(), MODE_POINT);
             if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
             if (OrderType()==OP_BUY) {
               pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
             }
             if (OrderType()==OP_SELL) {
               pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
            }
          }
        }
      }
    }
  }
  return(pr);
}
 
MakarFX #:

Essayez de déplacer "NormalizeDouble"

inchangé.

 
MakarFX #:

Makar a inséré du code dans l'EA jusqu'à présent uniquement pour comparer le profit en devise et le profit en pips ; d'après ce que j'ai compris, cela peut être compris lorsque ces fonctions ont des valeurs nulles.