[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 285

 
rid >> :

Talvez a função https://www.mql5.com/ru/forum/107476/page21 possa ajudar.

Função isCloseLastPosByTake().
Esta função retorna uma bandeira para fechar a última posição na tomada.

Flag up - True - TakeProfit foi acionado.

Bandeira arriada - Falsa - posição foi fechada devido a outro motivo.


A função em si deve ser colocada logo no final do código. Eu também acrescento à condição de vender:


Bom dia, noite ou manhã para todos VOCÊS.

Eu fiz tudo como o escrevi. Coloquei a função no final do código e a acrescentei às minhas condições de venda.

if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем

Pensei nisso e o acrescentei para comprar. Os pedidos serão fechados não somente pela BUY, mas também pela SHELL.

Eu inseri a função isCloseLasPosByTake() no final.

2;116;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;104:33;'(' - function definition unexpected
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:7;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:14;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:27;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:33;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:15;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:37;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:17;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:46;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;116:19;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;117:17;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;127:19;'sy' - variable not defined

Aqui está uma torta, ou como estava dizendo pfc Gotsman pintura a óleo. ajude o boneco a sair.... não sabe nada.......

o próprio código (ou seja, apenas o início)

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {//покупаем
     if( CheckOrders(OP_SELL))
      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;
        else
         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;
        else
         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
       }
    
    // Открытие позиции Sell продажа  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем
     if( CheckOrders(OP_BUY))
      {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;
        else
         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;
        else
         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
       }
       bool isCloseLastPosByTake(string sy=NULL, int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy==NULL) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}
//----
   return(0);
  }//+------------------------------------------------------------------+
 
igrok2008 >> :


Eu escrevi especificamente no meu posto. Que esta função éCloseLastPosByTake() - deve ser colocada no final do código, ANTES da FUNÇÃO DE INÍCIO!

E onde você o colocou?

E tenha cuidado com os parênteses encaracolados nas condições de compra e venda. É claro que estão faltando lá (verifique - que o número de parênteses abertos é igual ao número de parênteses fechados). Aqui foi corrigida a venda :

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
 

Bom dia!!!


Eu preciso de ajuda! Peço desculpas por não ter sido modesto.

Mas aqui está meu problema, tenho um EA que é baseado em um Martin, ele coloca a primeira encomenda VENDA ou COMPRA, o que eu quiser, mas eu quero poder escolher COMPRAR ou VENDER em propriedades EA. Isto é, eu coloco, por exemplo, COMPRAR em suas propriedades e abre um pedido de COMPRA apenas, ou o contrário.

Receio ainda não ter aprendido a programar na MQL4 .


Estou anexando o próprio conselheiro.


Agradecemos antecipadamente àqueles que responderão!

 
rid >> :

Eu escrevi especificamente no meu posto. Que esta função éCloseLastPosByTake() - deve ser colocada no final do código, ANTES da FUNÇÃO DE INÍCIO!

E onde você o colocou?

E preste mais atenção com parênteses curvos nas condições de compra e venda. É claro que estão faltando lá (verifique - que o número de parênteses abertos é igual ao número de parênteses fechados). Aqui está a solução para a venda :


Coloquei-o depois do início fi, por isso entendo.....

Enganei-me então, obrigado pelo cutucão :-))

Se eu acertei, deve ser colocado após } no final do bloco de função de desinicialização de especialistas ??????? ou após o retorno(0); no final mesmo do start-???????

Obrigado antecipadamente por sua paciência!!!!!!!!!

 
igrok2008 >> :

Coloquei-a após a função de início, portanto entendo.....

Enganei-me, obrigado pelo cutucão :-))

Se entendi corretamente, deve ser colocado após } no final do bloco de função de desinicialização de especialistas ??????? ou após o retorno(0); no final mesmo do início-???????

Obrigado antecipadamente por sua paciência!!!!!!!!!

Deve ser colocado do lado de fora. Não dentro de qualquer função, - mas como uma função independente separada.

Assim:

int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {
     if( CheckOrders(OP_SELL))                                      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;        else         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;        else         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
                }
               }
              }
//-------------------Конец покупки -----------------------

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
    
//----
   return(0);
  }//+----------КОНЕЦ ФУНКЦИИ СТАРТ -------------------+


//ЖЖЖЖЖЖЖ Другие вызываемые пользовательские функции ЖЖЖЖЖЖ

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия           |
//|  последней позиции по тейку.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }} }}}}}

  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}


Não tenho certeza de que sob estas condições, o Assessor Especialista irá trabalhar. Porque a primeira posição não poderá ser aberta.

A função éCloseLastPosByTake() deve ser removida de uma condição de Compra ou Venda.

Então o assessor trabalhará.

 
Rover82 >> :

Bom dia!!!

Mas aqui está meu problema, tenho um EA que é baseado em um Martin, ele coloca a primeira encomenda VENDA ou COMPRA, o que eu quiser, mas eu quero poder escolher COMPRAR ou VENDER em propriedades EA. Isto é, eu coloco por exemplo COMPRAR em suas propriedades e abre um pedido de COMPRA apenas, ou vice versa.

Estou anexando a própria EA.

Agradecemos antecipadamente a todos que responderem!


É improvável que alguém responda. A EA é descompilada (hackeada) e tais arquivos não são bem-vindos aqui...

 
WinExec("C:\\Program Files\\Opera\\opera.exe http://www.mail.ru",2);
Olá a todos, isto é lançar o link com um navegador específico, mas como faço para lançar o mesmo link por padrão?
 
Isto é, com o navegador padrão
 
Dimoncheg >> :
Isto é, o navegador padrão

ShellExecute, o comando "aberto", por assim dizer.

 

Decidi estudar a MQL 4, uma vez que tudo o que encontrei não corresponde às minhas aspirações. No momento estou estudando a fim de entender como os profissionais trabalham e melhorá-lo para minha idéia. Há uma função personalizada (simples e pequena, uma página), o código é anexado. Devido ao meu amadorismo, não consigo entender por dois dias - o que esta função retorna como resultado, e qual condição aninhada é a Otra?

Alguém gostaria de plantar uma centelha de conhecimento no meu entorpecimento?

O que eu recebo é isto:

O objetivo da função é determinar se já existe um pedido feito para este par e, se existe, determinar seu tipo.

A função que chamou esta função aguarda a presença de uma das ordens selecionadas no procedimento interruptor, A função deve retornar "1", na presença de duas ordens - "2", e na ausência de ordens "-1".

O ciclo é iniciado se l_pos_16= 0. Vamos assumir que temos quatro pedidos pendentes no total para alguns pares, incluindo dois no par onde a EA está trabalhando e eles não são os primeiros.

Entretanto, na primeira iteração do laço, a função if(OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) Verifique a posição com o número "0" na lista de ordens, mas não existe tal posição (porque entendo que a numeração começa a partir da posição 1) e depois passará para a próxima. senão com saída completa de fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12) com retorno do valor Retorno(-1).

Para meu entendimento, o sentido da função como um todo se perde, uma vez que o resultado deve ser o mesmo, quer haja ou não qualquer ordem para o par .

Entretanto, quando a EA funciona, esta função define e dá a você o que a chamada função espera dela, que então funciona de acordo com o resultado obtido .

Eu também não entendo o que senão Retorno(-1) trabalhará em

se (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {

Ou mesmo em if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

O código da função :

int fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12)

a_count_0= 0;

a_count_4 = 0;

a_count_8 = 0;

a_count_12 = 0;

gi_252 = 0;

para (int l_pos_16 = 0; l_pos_16 < OrderTotal(); l_pos_16++) {

se (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

switch (OrderType()) caso OP_BUY:

a_count_0+++;

gi_252 = 1;

g_ticket_268 = OrderTicket();

gs_272 = OrderComment();

g_ord_open_open_price_256 = OrderOpenPrice();

g_ord_stoploss_288 = OrderStopLoss();

g_ord_takeprofit_296 = OrderTakeProfit();

pausa;

caso OP_SELL:

a_count_4++;

gi_252 = -1;

g_ticket_268 = OrderTicket();

gs_272 = OrderComment();

g_ord_open_open_price_256 = OrderOpenPrice();

g_ord_stoploss_288 = OrderStopLoss();

g_ord_takeprofit_296 = OrderTakeProfit();

pausa;

caso OP_BUYSTOP:

a_count_8++;

pausa;

caso OP_SELLSTOP:

a_count_12++;

}

}

} caso contrário, retornar (-1);

}

retorno (a_count_0 + a_count_4 + a_count_8 + a_count_12);

/* execução normal do f-i retornará um na variável em um dos caso e "0" em todos os outros, o que indica que há um de

dos tipos de pedido, e o número deste pedido está disponível para a função de chamada,

comentar, abrir preço, parar perdas e ter lucro */

}