Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 324

 

È corretto?

for(int i=1; i<=OrdersTotal(); i++) // ciclo degli ordini

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // se

{

int OT=OrdiniTotali; //il numero di ordini aperti nel terminale

double Price=OrderOpenPrice(); // Prezzo dell'ordine selezionato

double Mas [Price][OT]; //array per mettere in ordine tutti gli ordini

o

for(int i=1; i<=OrdersTotal(); i++) //ordinare il ciclo

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // se c'è un

{

double Price=OrderOpenPrice(); // Prezzo dell'ordine selezionato

double Mas [Price]; //array per organizzare tutti gli ordini per prezzo?

 
vikzip:

È corretto?

for(int i=1; i<=OrdersTotal(); i++) // ciclo degli ordini

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // se

{

int OT=OrdiniTotali; //il numero di ordini aperti nel terminale

double Price=OrderOpenPrice(); // Prezzo dell'ordine selezionato

double Mas [Price][OT]; //array per mettere in ordine tutti gli ordini

o

for(int i=1; i<=OrdersTotal(); i++) //ordinare il ciclo

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // se c'è un

{

double Price=OrderOpenPrice(); // Prezzo dell'ordine selezionato

double Mas [Price]; //array per organizzare tutti gli ordini per prezzo?

1. OrdersTotal restituisce il totale degli ordini, ma sono numerati a partire da zero. Ecco perché il ciclo deve essere i < OrdersTotal()

2. L'array deve essere dichiarato doppio Mas[];. Se l'ordine viene selezionato con successo, la dimensione dell'array deve essere aumentata, perché non sappiamo quanti ordini ci sono in totale.

3. L'indice della stringa dell'array deve essere tra parentesi quadre. Mas[i] = Prezzo;

Di conseguenza, entrambi sono sbagliati.

 
Alexey Viktorov:

1. OrdersTotal restituisce il numero totale di ordini, ma sono numerati a partire da zero. Ecco perché il ciclo dovrebbe essere i < OrdersTotal()

2. L'array deve essere dichiarato doppio Mas[];. Se un ordine viene scelto con successo, la dimensione dell'array deve essere aumentata, perché non sappiamo quanti ce ne sono...

3. L'indice della stringa dell'array deve essere tra parentesi quadre. Mas[i] = Prezzo;

Di conseguenza, entrambi sono sbagliati.


Grazie mille!

 
Alexey Viktorov:

1. OrdersTotal restituisce il numero totale di ordini, ma sono numerati a partire da zero. Pertanto, il ciclo deve essere i < OrdiniTotali()

2. L'array deve essere dichiarato doppio Mas[];. Se un ordine viene scelto con successo, la dimensione dell'array deve essere aumentata, perché non sappiamo quanti ce ne sono...

3. L'indice della stringa dell'array deve essere tra parentesi quadre. Mas[i] = Prezzo;

Di conseguenza, entrambi sono sbagliati.


Otterremo un array unidimensionale di prezzi d'ordine in questo caso?

double Price=OrderOpenPrice(); // Prezzo dell'ordine selezionato

double Mas[i] = Price; //array per mettere in ordine tutti gli ordini

for(int i=1; i<OrdersTotal();) // ciclo degli ordini

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // se c'è un prossimo

i++;

}

 
vikzip:

E in questo caso, sarà un array unidimensionale di prezzi d'ordine?

double Price=OrderOpenPrice(); // Prezzo dell'ordine selezionato

double Mas[i] = Price; //array per mettere in ordine tutti gli ordini

for(int i=1; i<OrdersTotal();) // ciclo degli ordini

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // se c'è un prossimo

i++;

}

No. È più o meno così.
  double Price;               // Цена выбранного ордера
  double Mas[];                      //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++;)          // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий
     {
      ArrayResize(Mas, ArraySyze()+1);
      Mas[i] = OrderOpenPrice();
// или 
//    Price=OrderOpenPrice();
//    Mas[i] = Price;
     }
   }

Selezionato ==true non può essere scritto.

 
Alexey Viktorov:
No, è più o meno così.

L'evidenziato ==true non può essere scritto.


Grazie mille!

 
Nel pomeriggio, c'è una linea per selezionare il profitto in valuta. Voglio 1) avere una scelta nelle impostazioni dell'EA di un profitto fisso (come è già) o una parte del deposito come percentuale. Per favore, consigliate come fare questo.
La stringa originale è questa:

Doppio profitto esterno =10;

2) fare in modo che l'autoconteggio del profitto sia attivato, disattivato dalla cifra selezionata del saldo del conto.

Linea di fondo:
Profitto: fix/autocount.
Fix - quantità.
Autorate - percentuale del saldo.
Attivare l'autorun - profitto %.
Disattivare il conteggio automatico - profitto/perdita in %.
Selezionare il valore a partire dal quale saranno conteggiati i profitti/perdite dell'autoconto
 

Ciao. Potete dirmi come sbarazzarmi della chiusura e dell'apertura di un ordine pendente su ogni barra? Ho bisogno che si apra e che aspetti che si apra l'ordine corrispondente.

//+------------------------------------------------------------------+
//|                                                e-News-Lucky$.mq4 |
//|                                                   Lucky$ & KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|   24.10.2005                                                     |
//| Выставление ордеров в определённое время на пробой диапазона.    |
//| Если ни один ордер не сработал, то модификация на каждом баре.   |
//+------------------------------------------------------------------+
#property copyright "Lucky$ & KimIV"
#property link      "http://www.kimiv.ru"
#define    MAGIC     123

//------- Внешние параметры советника --------------------------------
extern string _Parameters_Trade = "----- Параметры торговли";
extern double Lots           = 0.01;     // Размер торгуемого лота
extern int    StopLoss       = 0;      // Размер фиксированного стопа
extern int    TakeProfit     = 0;       // Размер фиксированного тэйка
extern string TimeSetOrders  = "10:30"; // Время установки ордеров
extern string TimeDelOrders  = "22:30"; // Время удаления ордеров
extern string TimeClosePos   = "22:30"; // Время закрытия позиций
extern int    DistanceSet    = 200;      // Расстояние от рынка
extern bool   UseTrailing    = True;    // Использовать трал
extern bool   ProfitTrailing = True;    // Тралить только профит
extern int    TrailingStop   = 25;      // Фиксированный размер трала
extern int    TrailingStep   = 5;       // Шаг трала
extern int    Slippage       = 3;       // Проскальзывание цены

extern string _Parameters_Expert = "----- Параметры советника";
extern string Name_Expert   = "e-News-Lucky$";
extern bool   UseSound      = True;         // Использовать звуковой сигнал
extern string NameFileSound = "expert.wav"; // Наименование звукового файла
extern color  clOpenBuy     = LightBlue;    // Цвет открытия покупки
extern color  clOpenSell    = LightCoral;   // Цвет открытия продажи
extern color  clModifyBuy   = Aqua;         // Цвет модификации покупки
extern color  clModifySell  = Tomato;       // Цвет модификации продажи
extern color  clCloseBuy    = Blue;         // Цвет закрытия покупки
extern color  clCloseSell   = Red;          // Цвет закрытия продажи

//---- Глобальные переменные советника -------------------------------
int prevBar;

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
void deinit() {
  Comment("");
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  if (TimeToStr(CurTime(), TIME_MINUTES)==TimeSetOrders) SetOrders();
  if (prevBar!=Bars && ExistOrder(1) && ExistOrder(2)) ModifyOrders();
  DeleteOppositeOrders();
  TrailingPositions();
  if (TimeToStr(CurTime(), TIME_DATE)==TimeDelOrders) DeleteAllOrders();
  if (TimeToStr(CurTime(), TIME_MINUTES)==TimeClosePos) CloseAllPositions();
  prevBar=Bars;
}

//+------------------------------------------------------------------+
//| Установка ордеров                                                |
//+------------------------------------------------------------------+
void SetOrders() {
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk=Ask+(DistanceSet+spr)*Point;
  double pBid=Bid-DistanceSet*Point;

  if (!ExistOrder(1)) {
    if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
    if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
    SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1);
  }
  if (!ExistOrder(2)) {
    if (StopLoss!=0) ldStop=pBid+StopLoss*Point;
    if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
    SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2);
  }
}

//+------------------------------------------------------------------+
//| Модификация ордеров                                              |
//+------------------------------------------------------------------+
void ModifyOrders() {
bool ret;
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk=Ask+(DistanceSet+spr)*Point;
  double pBid=Bid-DistanceSet*Point;

  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+1) {
        if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
        if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
        ret=OrderModify(OrderTicket(), pAsk, ldStop, ldTake, 0, clModifyBuy);
      }
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+2) {
        if (StopLoss!=0) ldStop=pBid+StopLoss*Point;
        if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
        ret=OrderModify(OrderTicket(), pBid, ldStop, ldTake, 0, clModifySell);
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования ордера или позиции по номеру       |
//+------------------------------------------------------------------+
bool ExistOrder(int mn) {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+mn) {
        Exist=True; break;
      }
    }
  }
  return(Exist);
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции по номеру                  |
//+------------------------------------------------------------------+
bool ExistPosition(int mn) {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+mn) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
  return(Exist);
}

//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//| Параметры:                                                       |
//|   op     - операция                                              |
//|   pp     - цена                                                  |
//|   ldStop - уровень стоп                                          |
//|   ldTake - уровень тейк                                          |
//|   mn     - добавить к MAGIC                                      |
//+------------------------------------------------------------------+
void SetOrder(int op, double pp, double ldStop, double ldTake, int mn) {
  bool ret;
  color  clOpen;
  string lsComm=GetCommentForOrder();

  if (op==OP_BUYSTOP) clOpen=clOpenBuy;
  else clOpen=clOpenSell;
  ret=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC+mn,0,clOpen);
  if (UseSound) PlaySound(NameFileSound);
}

//+------------------------------------------------------------------+
//| Генерирует и возвращает строку коментария для ордера или позиции |
//+------------------------------------------------------------------+
string GetCommentForOrder() {
  return(Name_Expert);
}

//+------------------------------------------------------------------+
//| Удаление всех ордеров                                            |
//+------------------------------------------------------------------+
void DeleteAllOrders() {
  bool fd;
  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderMagicNumber()>MAGIC && OrderMagicNumber()<=MAGIC+2) {
        if (OrderSymbol()==Symbol()) {
          if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
            fd=OrderDelete(OrderTicket());
            if (fd && UseSound) PlaySound(NameFileSound);
          }
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Закрытие всех позиций по рыночной цене                           |
//+------------------------------------------------------------------+
void CloseAllPositions() {
  bool fc;
  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderMagicNumber()>MAGIC && OrderMagicNumber()<=MAGIC+2) {
        if (OrderSymbol()==Symbol()) {
          fc=False;
          if (OrderType()==OP_BUY) {
            fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
          }
          if (OrderType()==OP_SELL) {
            fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
          }
          if (fc && UseSound) PlaySound(NameFileSound);
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Удаление противоположных ордеров                                 |
//+------------------------------------------------------------------+
void DeleteOppositeOrders() {
  bool fd, fep1, fep2;

  fep1=ExistPosition(1);
  fep2=ExistPosition(2);

  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol()) {
        fd=False;
        if (OrderType()==OP_BUYSTOP && OrderMagicNumber()==MAGIC+1) {
          if (fep2) fd=OrderDelete(OrderTicket());
        }
        if (OrderType()==OP_SELLSTOP && OrderMagicNumber()==MAGIC+2) {
          if (fep1) fd=OrderDelete(OrderTicket());
        }
        if (fd && UseSound) PlaySound(NameFileSound);
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderMagicNumber()>MAGIC && OrderMagicNumber()<=MAGIC+2) {
        if (OrderSymbol()==Symbol()) {
          if (OrderType()==OP_BUY) {
            if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingStop*Point) {
              if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) {
                ModifyStopLoss(Bid-TrailingStop*Point, clModifyBuy);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingStop*Point) {
              if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0) {
                ModifyStopLoss(Ask+TrailingStop*Point, clModifySell);
              }
            }
          }
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//|   clModify   - цвет модификации                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStop, color clModify) {
  bool   fm;
  double ldOpen=OrderOpenPrice();
  double ldTake=OrderTakeProfit();

  fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, clModify);
  if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+

 

Salve. Qualcuno di voi usa gli indicatori di ClasterDelta nel suo lavoro? Ho una domanda sull'uso automatico dei dati dell'indicatore VolumeProfile. Il fatto è che questo indicatore non restituisce nulla, ma disegna solo un istogramma di linee di tendenza. Ma quando si mette il cursore su questa linea, appare il valore del volume scambiato in questo tick. Come ottenere queste informazioni dall'indicatore!

Qualche pensiero?

 

Come ho incontrato prima studiando le classi, ancora una volta ci sono sfumature che non sono descritte negli articoli o da qualche parte così nascoste che non è possibile trovare attraverso un motore di ricerca. Un'intera giornata passata invano a cercare spiegazioni. Per esempio cosa significa questo simbolo e come influisce se non. Come si vede qui sotto nell'esempio di stati, prima c'è e poi non c'è: &

   // Для int. Проверка существования в массиве элемента с заданным значением
   int Find(int & aArray[],int aValue)
     {
      for(int i=0; i<ArraySize(aArray); i++) 
        {
         if(aArray[i]==aValue) 
           {
            return(i); // Элемент существует, возвращаем индекс элемента
           }
        }
      return(-1); // Нет такого элемента, возвращаем -1
     }

Anche questo simbolo non è chiaro cosa significa: ~

   // Конструктор
                     CName() { Alert("Конструктор"); }
   // Деструктор
                    ~ CName() { Alert("Деструктор"); }

*

CInfo * returnInfo()
  {
   CInfo * i = new CInfo();
   i.symbol=_Symbol;

   return i;
  }