MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 324

 

これでよいのでしょうか?

for(int i=1; i<=OrdersTotal(); i++) // オーダーループ

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // 以下の場合。

{

int OT=OrdersTotal; //端末にある未決済注文の数

double Price=OrderOpenPrice(); //選択された注文の 価格

double Mas [価格][OT]; //すべての注文を順番に並べるための配列

または

for(int i=1; i<=OrdersTotal(); i++) //オーダーループ

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // がある場合。

{

double Price=OrderOpenPrice(); // 選択された注文の価格

double Mas [価格]; //すべての注文を価格で並べる配列?

 
vikzip:

これでよいのでしょうか?

for(int i=1; i<=OrdersTotal(); i++) // オーダーループ

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // 以下の場合。

{

int OT=OrdersTotal; //端末にある未決済注文の数

double Price=OrderOpenPrice(); //選択された注文の 価格

double Mas [価格][OT]; //すべての注文を順番に並べるための配列

または

for(int i=1; i<=OrdersTotal(); i++) //オーダーループ

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // がある場合。

{

double Price=OrderOpenPrice(); // 選択された注文の価格

double Mas [価格]; //すべての注文を価格で並べるための配列?

1.OrdersTotalは注文の総数を返しますが、0から始まる番号になっています。そのため、ループはi < OrdersTotal()でなければなりません。

2.配列は double Mas[]; と宣言する必要があります。注文が正常に選択された場合、注文が全部で何個あるか分からないので、配列のサイズを大きくする必要があります。

3.配列文字列のインデックスは角括弧で囲む必要がある。Mas[i] = Price;

その結果、どちらも間違っている。

 
Alexey Viktorov:

1.OrdersTotalは注文の総数を返しますが、0から始まる番号になっています。そのため、i < OrdersTotal()となるようにループさせる必要があります。

2.配列は double Mas[]; と宣言する必要があります。オーダーが正常に選択された場合、その数が分からないので、配列のサイズを大きくする必要があります...。

3.配列文字列のインデックスは角括弧で囲む必要がある。Mas[i] = Price;

その結果、どちらも間違っている。


ありがとうございました。

 
Alexey Viktorov:

1.OrdersTotalは注文の総数を返しますが、0から始まる番号になっています。したがって、ループはi < OrdersTotal()でなければなりません。

2.配列は double Mas[]; と宣言する必要があります。オーダーが正常に選択された場合、その数が分からないので、配列のサイズを大きくする必要があります...。

3.配列文字列のインデックスは角括弧で囲む必要がある。Mas[i] = Price;

その結果、どちらも間違っている。


この場合、注文価格の一次元配列が得られるのでしょうか?

double Price=OrderOpenPrice(); //選択された注文の 価格

double Mas[i] = 価格; //すべての注文を順番に並べるための配列

for(int i=1; i<OrdersTotal();) // オーダーループ

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // 次がある場合

i++;

}

 
vikzip:

そしてこの場合、注文価格の一次元配列になるのですね。

double Price=OrderOpenPrice(); //選択された注文の 価格

double Mas[i] = 価格; //すべての注文を順番に並べるための配列

for(int i=1; i<OrdersTotal();) // オーダーループ

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // 次がある場合

i++;

}

いや、どちらかというとこんな感じです。
  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;
     }
   }

選択された==trueは書き込めない場合があります。

 
Alexey Viktorov:
いや、どちらかというとこんな感じです。

ハイライトされた==trueは書き込めない場合があります。


ありがとうございました。

 
午後は、通貨で利益を選択する行があります。1)EAの 設定で、固定利益(すでにあるもの)か、入金額の一部をパーセンテージで選択できるようにしたい。どうしたらよいかアドバイスをお願いします。
元の文字列はこうです。

外部ダブルプロフィット =10;

2) 利益の自動計算を有効にし、口座残高の選択された桁で無効にする。

結論から言うと
プロフィット:fix/autocount。
修正 - 量。
Autorate - 残高の割合。
自動実行をオンにする - 利益 %.
自動実行を無効にする - 利益/損失(単位:%)。
オートアカウントの損益をカウントする値を選択します。
 

こんにちは。各バーでの決済と保留注文の 開始をなくす方法を教えてください。開いて、対応する注文が開くのを待つ必要があるんです。

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

 

こんにちは。ClasterDeltaのインジケータを業務で使用している方はいらっしゃいますか? VolumeProfileインジケータのデータの自動使用について質問させてください。このインジケータは何も返さず、トレンド ラインのヒストグラムを描くだけだということです。しかし、この行にカーソルを合わせると、このティックで取引された出来高の値が表示されます。インジケーターからこの情報を取り出すには!?

何か感想はありますか?

 

授業の勉強をする前にも遭遇しましたが、やはり記事には書かれていない、あるいは検索エンジンでは見つけられないほど隠れたところにニュアンスがあるのです。一日中、説明を求めて無駄な時間を過ごした。例えば、このマークは何を意味するのか、そうでない場合はどう影響するのか。以下のstatiの 例で見られるように、最初はあって、次にない:&。

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

また、この記号は何を意味しているのか不明です:

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

*

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

   return i;
  }