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

 
Maxim Kuznetsov:

algo como isto :

string level="Level"+IntegerToString(iTime(_Symbol,iBarShift(OrderCloseTime())); // ид.уровня - по времени бара (!! не по тикету)

if (ObjectFind(level)‌==-1) {

  // гор.вектора нет - видимо первый ордер из закрытых на баре

  // сделать горизонтальную линию‌

  ObjectCreate(0,level,OBJ_TREND,0,OrderCloseTime(),OrderClosePrice(),OrderCloseTime()+PeriodSeconds(_Period)*3,OrderClosePrice);

 // указывающую только вправо‌

  ObjectSetInteger(level,‌OBJPROP_RAY,1);

  ObjectSetInteger(level,OBJPROP_RAYLEFT,0);

‌ // украсить её как-то :-)

 ObjectSetInteger(level,OBJPROP_‌COLOR,....)

 ....‌

} else {

  // гор.уровень есть - значит были ордера закрытые на этом баре

  // по фантазии - обновить метки/корректировать уровень/etc‌

}‌

int TotalPos=-1;

void start()
 
{
 // остальной код

//--
  if(OrdersTotal()!=TotalPos) { // не мучаем каждый тик
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      History();

  
     }
  }}} TotalPos=OrdersTotal(); // запомним количество
//--
}
 
 
 
 void History() {
  string Ticket=(string)OrderTicket();
  color col=Red;
  if(OrderType()==0)col=Blue;
  datetime a=OrderOpenTime();
  double b=OrderOpenPrice();
  datetime c=OrderCloseTime();
  double d=OrderClosePrice();
  double prSep=OrderProfit()+OrderCommission()+OrderSwap();
  double prAll=0;
  int    cn=0;
  string hTicket;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;
      }
   }}}
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
     
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
     
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
 
   Ticket=cn>1?hTicket:Ticket;
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_ANCHOR,0);
   ObjectSetText(Ticket+"Profit",DoubleToString(prAll,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+Period()*60*2);
}

Usar um vetor como um localizador de nível está errado.... não é bom ....((

E se nós fizermos um movimento de cavalo)

Na busca de nível utilize o princípio da soma de lucro no nível de preço, cujo registro já existe.

Por exemplo: aqui nós fizemos uma tentativa e somamos os lucros com um atraso de 60 segundos

 for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;

Em seguida, precisamos criar um registro:

Se o número de lucros acumulados no nível > 1, então esta é nossa ordem - nosso nível, a partir deste nível tiramos um raio

 

Saudações.

Estou planejando uma EA com funções que, a cada tique, irão percorrer as ordens disponíveis criadas por ela e agir de acordo com a situação.

Você pode aconselhar como fazer variáveis separadas para cada novo pedido e para que outros loops trabalhem com elas? (presumo que isto seja algo como Peremennaja+ticket=12345;)

 
Andrey Sokolov:

Saudações.

Estou planejando uma EA com funções que, a cada tique, irão percorrer as ordens disponíveis criadas por ela e agir de acordo com a situação.

Você pode aconselhar como fazer variáveis separadas para cada novo pedido e para que outros loops trabalhem com elas? (presumo que isto seja algo como Peremennaja+ticket=12345;)

De preferência uma matriz ou mesmo uma matriz de estruturas.
 
Alexey Viktorov:
Melhor uma série ou mesmo uma série de estruturas.

Desculpe-me, você pode elaborar?
 
Andrey Sokolov:

Desculpe-me, poderia entrar em mais detalhes?


Aqui e aqui.

É criada uma estrutura e um conjunto de tipos de estrutura. Fora de todo o código.

struct trade_settings
  {
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
   uchar  slippage;     // значение допустимого проскальзывания
  };
//--- создали массив типа trade_settings
trade_settings my_set[];
// присвоить значение нулевому индексу массива в основном коде
my_set[0].take = что_то;
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
 

Olá.

Ajude-me a encontrar a intersecção da linha horizontal"ResisL" ea linha de tendência pelo ângulo"TrndL".

TRA
 
Nikolay Fedyay:

Olá.

Ajude-me a encontrar a intersecção da linha horizontal"ResisL" ea linha de tendência pelo ângulo"TrndL".

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(double left_bar, double left_price, double right_bar, double right_price, double bar_to_search) {
  return((right_bar==left_bar)?left_price:(right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
}
//+------------------------------------------------------------------+
Se você conhecer dois pontos de coordenadas da linha de declive e colá-los como paramatrizadores desta função, a saída lhe dará o preço do ponto no bar_a_pesquisa. Resta apenas chamar esta função no laço da barra e comparar o valor que ela retorna com o preço da linha horizontal. Se na última barra do ciclo o valor retornado pela função for menor ou igual ao preço da linha horizontal, e na barra atual do ciclo o valor retornado pela função for maior que o preço da linha, então as coordenadas X do ponto de intersecção serão o tempo correspondente ao índice do ciclo e as coordenadas Y serão o preço retornado pela função.
 
Artyom Trishkin:

Obrigado.

Que tal se você quiser saber o ponto de cruzamento quando ainda não há barras, ou seja, uma data no futuro.

 
Nikolay Fedyay:

Obrigado.

Que tal se você quiser saber o ponto de cruzamento quando ainda não há barras, ou seja, uma data no futuro.

Ainda não experimentei esta função - necessidade de experimentar.

 
Artyom Trishkin:

Ainda não experimentei esta função - necessidade de experimentar.

Por favor, se você encontrar tempo para experimentar, compartilhe o resultado.

Porque eu não tenho idéia do que experimentar
.