Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 324

 

Ist dies richtig?

for(int i=1; i<=OrdersTotal(); i++) // Auftragsschleife

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // wenn die folgenden

{

int OT=OrdersTotal; //die Anzahl der offenen Aufträge im Terminal

double Price=OrderOpenPrice(); // Preis der ausgewählten Bestellung

double Mas [Preis][OT]; //Array zum Ordnen aller Aufträge

oder

for(int i=1; i<=OrdersTotal(); i++) //Ordnungsschleife

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // wenn es eine

{

double Price=OrderOpenPrice(); // Preis der ausgewählten Bestellung

double Mas [Preis]; //Array zur Sortierung aller Bestellungen nach Preis?

 
vikzip:

Ist dies richtig?

for(int i=1; i<=OrdersTotal(); i++) // Auftragsschleife

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // wenn die folgenden

{

int OT=OrdersTotal; //die Anzahl der offenen Aufträge im Terminal

double Price=OrderOpenPrice(); // Preis der ausgewählten Bestellung

double Mas [Preis][OT]; //Array zum Ordnen aller Aufträge

oder

for(int i=1; i<=OrdersTotal(); i++) //Ordnungsschleife

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // wenn es eine

{

double Price=OrderOpenPrice(); // Preis der ausgewählten Bestellung

double Mas [Preis]; //Array zur Sortierung aller Bestellungen nach Preis?

(1) OrdersTotal gibt die Gesamtzahl der Aufträge zurück, aber sie werden von Null an nummeriert. Deshalb muss die Schleife i < OrdersTotal() sein.

2. Das Array muss als double Mas[]; deklariert werden. Wenn die Bestellung erfolgreich ausgewählt wurde, sollte die Array-Größe erhöht werden, da wir nicht wissen, wie viele Bestellungen es insgesamt gibt.

3. Der Array-String-Index muss in eckigen Klammern stehen. Mas[i] = Preis;

Infolgedessen sind sie beide falsch.

 
Alexey Viktorov:

(1) OrdersTotal gibt die Gesamtzahl der Aufträge zurück, die jedoch von Null an nummeriert sind. Deshalb sollte die Schleife i < OrdersTotal() sein.

2. Das Array muss als double Mas[]; deklariert werden. Wenn eine Bestellung erfolgreich ausgewählt wird, sollte die Array-Größe erhöht werden, da wir nicht wissen, wie viele es sind...

3. Der Array-String-Index muss in eckigen Klammern stehen. Mas[i] = Preis;

Infolgedessen sind beide falsch.


Herzlichen Dank!

 
Alexey Viktorov:

(1) OrdersTotal gibt die Gesamtzahl der Aufträge zurück, die jedoch bei Null beginnend nummeriert sind. Daher muss die Schleife i < OrdersTotal() sein

2. Das Array muss als double Mas[]; deklariert werden. Wenn eine Bestellung erfolgreich ausgewählt wird, sollte die Array-Größe erhöht werden, da wir nicht wissen, wie viele es sind...

3. Der Array-String-Index muss in eckigen Klammern stehen. Mas[i] = Preis;

Infolgedessen sind sie beide falsch.


Erhalten wir in diesem Fall ein eindimensionales Array von Bestellpreisen?

double Price=OrderOpenPrice(); // Preis der ausgewählten Bestellung

double Mas[i] = Preis; //Array zum Ordnen aller Aufträge

for(int i=1; i<OrdersTotal();) // Auftragsschleife

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // wenn es einen nächsten gibt

i++;

}

 
vikzip:

Und in diesem Fall wird es ein eindimensionales Array von Bestellpreisen sein?

double Price=OrderOpenPrice(); // Preis der ausgewählten Bestellung

double Mas[i] = Preis; //Array zum Ordnen aller Aufträge

for(int i=1; i<OrdersTotal();) // Auftragsschleife

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // wenn es einen nächsten gibt

i++;

}

Nein. Es ist mehr oder weniger so.
  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;
     }
   }

Ausgewählte ==true dürfen nicht geschrieben werden.

 
Alexey Viktorov:
Nein. Es ist mehr oder weniger so.

Das hervorgehobene ==true darf nicht geschrieben werden.


Herzlichen Dank!

 
Nachmittags gibt es eine Zeile zur Auswahl des Gewinns in der Währung. Ich möchte 1) in den EA-Einstellungen die Möglichkeit haben, entweder einen festen Gewinn (wie es bereits der Fall ist) oder einen Teil der Einlage als Prozentsatz zu wählen. Bitte teilen Sie mir mit, wie ich dies tun kann.
Die ursprüngliche Zeichenfolge lautet wie folgt:

Externer doppelter Gewinn =10;

2) die automatische Zählung des Gewinns durch die gewählte Ziffer des Kontostands aktivieren oder deaktivieren.

Unterm Strich:
Gewinn: fix/autocount.
Fix - Betrag.
Autorate - Prozentsatz des Saldos.
Autorun einschalten - Profit %.
Autorun deaktivieren - Gewinn/Verlust in %.
Wählen Sie den Wert, ab dem der Gewinn/Verlust des Autokontos gezählt wird
 

Hallo. Können Sie mir sagen, wie ich das Schließen und Öffnen einer Pending Order auf jedem Balken loswerden kann? Ich muss sie öffnen und warten, bis der entsprechende Auftrag geöffnet wird.

//+------------------------------------------------------------------+
//|                                                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);
}
//+------------------------------------------------------------------+

 

Hallo. Verwendet hier jemand Indikatoren von ClasterDelta? Ich habe eine Frage zur automatischen Verwendung von Daten aus dem VolumeProfile Indikator. Die Sache ist die, dass dieser Indikator nichts zurückgibt, sondern nur ein Histogramm von Trendlinien zeichnet. Wenn Sie den Mauszeiger über diese Zeile bewegen, wird der Wert des zu diesem Zeitpunkt gehandelten Volumens angezeigt. Wie man diese Informationen aus dem Indikator herausbekommt!

Haben Sie eine Idee?

 

Wie ich schon beim Studium der Kurse festgestellt habe, gibt es auch hier Nuancen, die in den Artikeln nicht beschrieben werden oder so versteckt sind, dass man sie mit einer Suchmaschine nicht finden kann. Einen ganzen Tag lang haben wir vergeblich nach Erklärungen gesucht. Zum Beispiel, was dieses Symbol bedeutet und wie es sich auswirkt, wenn nicht. Wie unten im Beispiel von stati zu sehen ist, ist es erst da und dann nicht mehr: &

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

Auch bei diesem Symbol ist nicht klar, was es bedeutet: ~

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

*

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

   return i;
  }