[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 567

 
Catrock писал(а) >>

Outra pergunta de um iniciante.

Utilizo várias funções definidas pelo usuário em meu Expert Advisor. Como posso fazer com que estas funções sejam combinadas em uma biblioteca, e no corpo do Consultor Especialista basta chamá-las de lá.

Não estou familiarizado com a sintaxe da linguagem a este respeito.

Favor consultar a seção de documentação ou tutorial. Ainda não o encontrei lá.


https://book.mql4.com/ru/build/structure

https://www.mql5.com/ru/articles/1462

+ para completar... https://book.mql4.com/ru/appendix/examples

 

Como escrever uma função que verifica se há ou houve posições em aberto na barra zero (de preferência uma escolha de prazo). OpenPosLastBar(string sym="", int tf=0, int op=-1, int mn=-1), ou esta função faz isso. Como entendi, só abrirá posições no momento, mas se já estava aberto e fechado, voltará -1.

//+----------------------------------------------------------------------------+
//| Retorna o número de barra da última posição aberta ou -1. |
//| Parâmetros: |
//| sym - nome do instrumento ("" - símbolo atual) |
//| tf - prazo ( 0 - prazo atual) |
//| op - operação (-1 - qualquer posição) |
//| mn - MagicNumber (-1 - qualquer magik) |
//+ +
int NumberOfBarLastPos(string sym="", int tf=0, int op=-1, int mn=-1)
{
datetime oot;
int i, k=OrdersTotal();

if(sym==="")
sym=Symbol();
for(i=0; ik; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==sym)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(op0 ||| OrderType()==op)
{
if(mn0 ||| OrderMagicNumber()==mn)
{
if(ootOrderOpenTime()) oot=OrderOpenTime();
}
}
}
}
}
}
} return(iBarShift(sym, tf, tf, oot, True));
}
//+----------------------------------------------------------------------------+

 
Precisamos de dois ciclos. Na primeira passamos pela história das encomendas, na segunda passamos pelas encomendas atuais. Em ambos os casos, se o tempo de abertura da ordem for maior ou igual ao Tempo[0], então a ordem foi aberta na vela atual. Isto é verdade para todos os prazos.
 
drknn >>:
Нужно два цикла. В первом проходим по истории ордеров, во втором - по текущим ордерам. В обоих случаях если время открытия ордера больше или равно Time[0], то ордер был открыт на текущей свече. Это справедливо для всех таймфреймов.

Obrigado por clicar. Você poderia pedir isso no código
 
gince >>:

Спадибо, что аткликнулся. А можно попросить это в коде

Aqui está um exemplo de uma passagem histórica

//=========== SchSellHist()  ===============================
//  Функция возвращает количество Sell-ордеров, лежащих в истории сегодняшних торгов
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSellHist(int MAGIC){
  string SMB=Symbol();
  int SchSell=0;
  int i;
  for (i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { WriteError(i);}
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=Time_D0){// сегодняшний ордер
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}    
             
//==================================================================================================

Tente criar seu próprio código, especialmente porque você tem o algoritmo e um exemplo pronto à sua frente.
 
Olá Pessoal! me ajude a entender o código depois que ele funciona muito lixo é deixado nas setas do gráfico círculos da linha como removê-los ou assim ele se remove a si mesmo aqui é parte do código
 
void seta(string a_name_0, int a_window_8, double a_datetime_12, double a_price_20, int ai_28, colour a_color_32, int a_width_36) {
ObjectDelete(a_name_0);
ObjectCreate(a_name_0, OBJ_ARROW, a_window_8, a_datetime_12, a_price_20);
ObjectSet(a_name_0, OBJPROP_ARROWCODE, ai_28);
ObjectSet(a_name_0, OBJPROP_COLOR, a_color_32);
ObjectSet(a_name_0, OBJPROP_WIDTH, a_width_36);
}

void _setabuy(string as_0) {
g_str_concat_356 = StringConcatenate(as_0, gi_120);
seta(g_str_concat_356, 0, TimeCurrent(), Bid + 15.0 * Ponto, SYMBOL_ARROWUP, Azul, 2);
gi_120++;
}

void _setasell(string as_0) {
g_str_concat_356 = StringConcatenate(as_0, gi_120);
seta(g_str_concat_356, 0, TimeCurrent(), Bid - 15.0 * Ponto, SYMBOL_ARROWDOWN, Vermelho, 2);
gi_120++;
}
 
drknn >>:

Вот пример прохода по истории


Попробуйте самостоятельно придумать код, тем более, что алгоритм и готовый пример у Вас перед глазами.

Obrigado. Vou tentar.
 
drknn >>:

Вот пример прохода по истории


Попробуйте самостоятельно придумать код, тем более, что алгоритм и готовый пример у Вас перед глазами.

Ou aqui está uma função que verifica se uma posição foi aberta na barra atual (com uma verificação em OrdersTotal() e OrdersHistoryTotal() ). Retorna verdadeiro se uma ordem de tipo foi aberta.

bool CheckExists(int Type)                                  
 {
  bool Result = True;
  for(int i = 0; i < OrdersTotal(); i++)
   if(OrderSelect(i, SELECT_BY_POS))
    if(OrderType() == Type && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
     if(OrderOpenTime() >= Time[0])
      Result = False;
  for(i = 0; i < OrdersHistoryTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     if(OrderType() == Type && OrderOpenTime() >= Time[0]
        && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
      Result = False;
    }

  return(Result);
  }
 

Por favor, diga-me como implementar a condição.

Se (há ordens pendentes) então faça isto e aquilo ;