Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 324

 

Isto é correto?

for(int i=1; i<=OrdensTotal(); i++) // Laço de encomenda

{

if(OrderSelect(i-1,SELECT_BY_POS)==verdadeiro) // se o seguinte

{

int OT=OrdensTotal; //o número de ordens em aberto no terminal

duplo Preço=Preço de Encomenda Aberto(); // Preço do pedido selecionado

duplo Mas [Preço] [OT]; //arranjo para colocar em ordem todos os pedidos

ou

for(int i=1; i<=OrdensTotal(); i++) //lote de ordem

{

se (OrderSelect(i-1,SELECT_BY_POS)==verdadeiro) // se houver um

{

duplo Preço=Preço de Encomenda Aberto(); // Preço do pedido selecionado

duplo Mas [Preço]; //array para organizar todos os pedidos por preço?

 
vikzip:

Isto é correto?

for(int i=1; i<=OrdensTotal(); i++) // Laço de encomenda

{

if(OrderSelect(i-1,SELECT_BY_POS)==verdadeiro) // se o seguinte

{

int OT=OrdensTotal; //o número de ordens em aberto no terminal

duplo Preço=Preço de Encomenda Aberto(); // Preço do pedido selecionado

duplo Mas [Preço] [OT]; //arranjo para colocar em ordem todos os pedidos

ou

for(int i=1; i<=OrdensTotal(); i++) //lote de ordem

{

se (OrderSelect(i-1,SELECT_BY_POS)==verdadeiro) // se houver um

{

duplo Preço=Preço de Encomenda Aberto(); // Preço do pedido selecionado

duplo Mas [Preço]; //array para organizar todos os pedidos por preço?

OrdensTotal retorna o número total de ordens, mas elas são numeradas a partir de zero. É por isso que o laço deve ser i < OrderTotal()

2. A matriz deve ser declarada com duplo Mas[];. Se o pedido for selecionado com sucesso, o tamanho da matriz deve ser aumentado, pois não sabemos quantos pedidos há no total.

3. O índice de cordas da matriz deve estar entre parênteses rectos. Mas[i] = Preço;

Como resultado, os dois estão errados.

 
Alexey Viktorov:

1. ordensTotal retorna o número total de ordens, mas elas são numeradas a partir de zero. É por isso que o laço deve ser i < OrderTotal()

2. A matriz deve ser declarada com duplo Mas[];. Se um pedido for escolhido com sucesso, o tamanho da matriz deve ser aumentado, pois não sabemos quantos deles existem...

3. O índice de cordas da matriz deve estar entre parênteses rectos. Mas[i] = Preço;

Como resultado, os dois estão errados.


Muito obrigado!

 
Alexey Viktorov:

1. ordensTotal retorna o número total de ordens, mas elas são numeradas a partir de zero. Portanto, o laço deve ser i < OrderTotal()

2. A matriz deve ser declarada com duplo Mas[];. Se um pedido for escolhido com sucesso, o tamanho da matriz deve ser aumentado, pois não sabemos quantos deles existem...

3. O índice de cordas da matriz deve estar entre parênteses rectos. Mas[i] = Preço;

Como resultado, os dois estão errados.


Vamos obter uma matriz unidimensional de preços de pedido neste caso?

duplo Preço=Preço de Encomenda Aberto(); // Preço do pedido selecionado

double Mas[i] = Preço; //arranjo para colocar em ordem todas as encomendas

for(int i=1; i<OrdersTotal();) // Laço de encomenda

{

if(OrderSelect(i-1,SELECT_BY_POS)==verdadeiro) // se houver um próximo

i++;

}

 
vikzip:

E, neste caso, será um conjunto unidimensional de preços de pedido?

duplo Preço=Preço de Encomenda Aberto(); // Preço do pedido selecionado

double Mas[i] = Preço; //arranjo para colocar em ordem todas as encomendas

for(int i=1; i<OrdersTotal();) // Laço de encomenda

{

if(OrderSelect(i-1,SELECT_BY_POS)==verdadeiro) // se houver um próximo

i++;

}

Não. É mais ou menos assim.
  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;
     }
   }

Selecionado ==verdadeiro não pode ser escrito.

 
Alexey Viktorov:
Não. É mais ou menos assim.

O destacado ==verdadeiro pode não ser escrito.


Muito obrigado!

 
À tarde, há uma linha para selecionar o lucro em moeda. Eu quero 1) ter a escolha nos ajustes da EA de um lucro fixo (como já é) ou uma parte do depósito como uma porcentagem. Por favor, informe como fazer isso.
O fio original é este:

Duplo lucro externo =10;

2) ativar a contagem automática do lucro, desativada pelo dígito selecionado do saldo da conta.

Resumindo:
Lucro: fixo/autocontável.
Fixar - montante.
Autorate - porcentagem de equilíbrio.
Ligue o autorun - lucro %.
Desativar autorun - lucro/perda em %.
Selecione o valor a partir do qual o lucro/perda da conta automática será contabilizado
 

Hi. Você pode me dizer como se livrar do fechamento e abertura de uma ordem pendente em cada bar? Preciso que abra e aguarde a ordem correspondente para abrir.

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

 

Olá. Alguém aqui usa indicadores do ClasterDelta em seu trabalho? Tenho uma pergunta sobre o uso automático dos dados do indicador VolumeProfile. O problema é que este indicador não retorna nada, mas apenas desenha um histograma de linhas de tendência. Mas ao colocar o cursor sobre esta linha, o valor do volume comercializado neste tick aparecerá. Como tirar esta informação do indicador!

Alguma idéia?

 

Como encontrei antes de estudar as aulas, novamente há nuances que não estão descritas nos artigos ou em algum lugar tão escondidas que não é possível encontrar através de um mecanismo de busca. Um dia inteiro passado em vão à procura de explicações. Por exemplo, o que este símbolo significa e como ele afeta, caso contrário. Como visto abaixo no exemplo do stati, primeiro ele está lá e depois não está: &

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

Também este símbolo não é claro o que significa: ~

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

*

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

   return i;
  }
Razão: