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

 

Boa tarde a todos.

Eu preciso de sua ajuda.

A EA tem uma função de contagem integrada para o lucro atual:

double GetProfitFromStart()
  {
   double lp=0,cp=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(lp+cp);
  }
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL("nextlot"   ,1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
      DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
       DrawLABEL("lab_Take" ,1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2)));
      TrailingOrders();
   }

O OnTick nulo é feito como acima.

Como fazer o contador de lucros redefinido para 0,0 se as condições forem atendidas:

if(CountOrders()==0) && (GetProfitFromStart()>0

ou seja, todos os pedidos são fechados e o lucro total quando o último pedido é fechado foi >0?

 

Instalado o MT4. Não economiza as cotações após o fechamento do terminal - carrega uma nova cada vez.

 
Maxim Kuznetsov #:

mesmo em 4, é melhor"abrir primeiro, modificar depois".

Nem todos permitem que você abra no mercado com um Stop Loss ao mesmo tempo.

A propósito, não há como parar a perda em todos os lugares. Se você quiser negociar com uma ordem stop-loss, você tem que verificá-la no servidor do corretor, é seu serviço pessoal (crédito, risco, ganhos), não onde você pensa que está, não há canal de negociação de ordens stop-loss.

Obrigado, sim, mesmo a demonstração em diferentes corretores mostra condições muito diferentes.

 
законопослушный гражданин #:

Boa tarde a todos.

Eu preciso de sua ajuda.

A EA tem uma função de contagem integrada para o lucro atual:

O OnTick nulo é feito como acima.

Como fazer o contrapeso do lucro zerado para 0,0 quando as condições são cumpridas:

if(CountOrders()==0) && (GetProfitFromStart()>0

Ou seja, todos os pedidos são fechados e o lucro total quando o último pedido é fechado foi >0?

Esta tarefa não é muito clara. Cada vez que a função de cálculo começa a percorrer as ordens/posições e resume os lucros a partir de zero.

 double lp=0,cp=0;

O que você quer zerar? Se você não tiver posições em aberto/ordens de mercado, a função de contagem retornará zero. Ela mesma zerará))))

 
законопослушный гражданин #:

Boa tarde a todos.

Eu preciso de sua ajuda.

Como fazer com que o contador de lucros seja zerado para 0,0 quando as condições forem cumpridas:

ou seja, todos os pedidos fechados e o lucro total quando o último pedido fechado foi >0???

O que exatamente disso não funciona?

 

Boa tarde. Por favor, ajude.

Procurando por pedidos fechados com retornos negativos.
Por totais que falham, não recebo o resultado de todas as ordens negativas.

Estou aprendendo a escrever.

double Minus_profit(){
 for (int i=OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
         if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OP_SELL)){
          if (OrderCloseTime()>=time && OrderTicket()>ticket){
            if (OrderProfit()+OrderSwap()+OrderCommission()<0){
             time=OrderCloseTime();
             ticket=OrderTicket();
             profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
             result=profit+swap+comis;   
   }}}}}return(result);
}
 
Alexander Avksentyev #:

Boa tarde. Por favor, ajude.

Procurando por pedidos fechados com retornos negativos.
Por totais que falham, não recebo o resultado de todas as ordens negativas.

Estou tentando aprender a escrever.

Num relance rápido, vejo que você está olhando através das posições desde o final e ao mesmo tempo, você escreve o tempo de fechamento na variável. Pode acontecer que você tenha capturado o tempo da posição mais recentemente fechada e a próxima condição não será mais verdadeira:

OrderCloseTime()>=time

como outras posições têm tempos de fechamento mais baixos. Tudo isso dependerá da classificação, mas na classificação padrão este é o problema.


Fixar também esta condição

(OrderType() == OP_BUY || OP_SELL)

para

(OrderType() == OP_BUY || OrderType() == OP_SELL)

Se tomarmos uma posição da história, OrderProfit() já armazenará o resultado final com permutas e comissão. Em posições abertas - não, tudo deve ser resumido. Mas isto não é certo, verifique.

 
Nikita Chernyshov #:

Com uma rápida olhada, vejo que você está olhando através das posições desde o final e está escrevendo o tempo de fechamento na variável. Pode acontecer que você tenha capturado o tempo da posição mais recentemente fechada e a próxima condição não será mais verdadeira:

como outras posições têm tempos de fechamento mais baixos. Tudo isso dependerá da classificação, mas na classificação padrão este é o problema.


Fixar também esta condição

para

Se tomarmos uma posição da história, OrderProfit() já armazenará o resultado final com permutas e comissão. Em posições abertas - não, tudo deve ser resumido. Mas isto não é preciso, por favor, verifique.

Obrigado. Isto funciona bem.

double Minus_profit(){
time=TimeCurrent();
 for (int i=0; i<OrdersHistoryTotal(); i++){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
       if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic){
        if (OrderType() == OP_BUY || OrderType() ==OP_SELL){
         if (OrderCloseTime()>=time){
          if (OrderProfit()+OrderSwap()+OrderCommission()<=0){
              time=OrderCloseTime();
              profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
              result=profit+swap+comis;   
   }}}}}}return(result);
}

Além disso, quando nos deparamos com uma ordem com um lucro positivo, devemos redefinir o resultado e procurar as negativas.

 
Alexander Avksentyev #:

Boa tarde. Por favor, ajude.

Procurando por pedidos fechados com retornos negativos.
Por totais que falham, não recebo o resultado de todas as ordens negativas.

Estou aprendendo a escrever.

Recomendo o uso de um depurador para esta e outras situações similares.

 

Boa tarde.

Diante de uma falta de compreensão de como ".Busca()" na biblioteca padrão.

Estou usando a classe padrão - CiTime() - A classe é uma classe para acessar séries temporais de abertura de barras.

int OnInit()
  {
//..
 TimeFrac=new CiTime();
   if(CheckPointer(TimeFrac)==POINTER_INVALID || !TimeFrac.Create(symbol_Name,TimeFr_Frac_D1))
      return INIT_FAILED;
   TimeFrac.Refresh();  
   TimeFrac.Sort();
//..

Ao tentar encontrar a Data que eu preciso (a classe é a mesma, mas o Período é diferente)

 int k = TimeFrac.Search(  Time.GetData(i)    );

Comete um erro:

GetData' - a conversão de parâmetros não é permitida.

Tentei substituir

Time.GetData(i)

para

datetime Time_GetData  =  Time.GetData(i);

Não funciona...

Eu me referi à Ajuda. Diz aí

int  Search( 
   CObject*  element      // образец 
   ) const

E um exemplo de aplicação selvagem.

Acontece que a busca de uma "Data" em uma classe padrão por uma "Data" conhecida da mesma classe não é possível!?!?

Apenas um Elemento de Classe.

CObject

Não consegui encontrar um exemplo de trabalho de como procurar uma data nesta classe.

Quem devo contatar para obter ajuda???

Obrigado.

Razão: