[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 285

 
rid >> :

Forse la funzione https://www.mql5.com/ru/forum/107476/page21 può aiutare.

Funzione isCloseLastPosByTake().
Questa funzione restituisce una bandiera per chiudere l'ultima posizione della presa.

Flag up - True - TakeProfit è stato attivato.

Flag abbassato - Falso - la posizione è stata chiusa per un altro motivo.


La funzione stessa dovrebbe essere messa alla fine del codice. Aggiungo anche alla condizione di vendere:


Buon giorno, sera o mattina a tutti voi.

Ho fatto tutto come ho scritto. Ho messo la funzione alla fine del codice e l'ho aggiunta alle mie condizioni di vendita.

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

Ci ho appena pensato e l'ho aggiunto per l'acquisto. Gli ordini saranno chiusi non solo da BUY, ma anche da SHELL.

Ho inserito la funzione isCloseLasPosByTake() alla fine.

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

Ecco una tale torta, o come si diceva pfc Gotsman pittura a olio. help the dummy out.... non sanno niente.......

il codice stesso (cioè solo l'inizio)

//+------------------------------------------------------------------+
//| 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 >> :


Ho scritto specificamente nel mio post. Che questa funzione isCloseLastPosByTake() - deve essere messa alla fine del codice, PRIMA della START FUNCTION!

E dove l'hai messo?

E fate attenzione alle parentesi graffe nelle condizioni di acquisto e di vendita. È chiaro che ti mancano (controlla che il numero di parentesi aperte sia uguale al numero di quelle chiuse). Qui ha corretto la vendita:

    //  ----- Открытие позиции 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()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
 

Buona giornata!!!


Ho bisogno di aiuto! Mi scuso per non essere modesto.

Ma ecco il mio problema, ho un EA che si basa su un Martin, mette il primo ordine VENDERE o COMPRARE, qualunque cosa io voglia, ma voglio essere in grado di scegliere COMPRARE o VENDERE nelle proprietà EA. Cioè metto ad esempio BUY nelle sue proprietà e apre un ordine BUY only, o il contrario.

Temo di non aver ancora imparato a programmare in MQL4 .


Sto allegando il consulente stesso.


Grazie in anticipo a chi risponderà!

 
rid >> :

Ho scritto specificamente nel mio post. Che questa funzione isCloseLastPosByTake() - deve essere messa alla fine del codice, PRIMA della START FUNCTION!

E dove l'hai messo?

E fate attenzione alle parentesi graffe nelle condizioni di acquisto e di vendita. È chiaro che ti mancano (controlla che il numero di parentesi aperte sia uguale al numero di quelle chiuse). Ecco la soluzione per la vendita:


L'ho messo dopo l'inizio fi, capisco.....

Ho sbagliato allora, grazie per il punzecchiamento :-))

Se ho capito bene, dovrebbe essere messo dopo } alla fine del blocco di funzioni di deinizializzazione esperto ??????? o dopo return(0); alla fine di start-???????

Grazie in anticipo per la vostra pazienza!!!!!!!!!

 
igrok2008 >> :

L'ho inserito dopo la funzione di avvio, quindi ho capito.....

Mi sono sbagliato, grazie per il poke :-))

Se ho capito bene, dovrebbe essere messo dopo } alla fine del blocco di funzioni di deinizializzazione esperto ??????? o dopo return(0); alla fine di start-???????

Grazie in anticipo per la vostra pazienza!!!!!!!!!

Deve essere collocato all'esterno. Non all'interno di qualsiasi funzione, - ma come una funzione separata e indipendente.

Come questo:

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


Non sono sicuro che in queste condizioni l'Expert Advisor funzioni. Perché la prima posizione non sarà in grado di aprire...

La funzione isCloseLastPosByTake() dovrebbe essere rimossa da una condizione di acquisto o vendita.

Allora il consulente funzionerà.

 
Rover82 >> :

Buon giorno!!!

Ma ecco il mio problema, ho un EA che si basa su un Martin, mette il primo ordine VENDERE o COMPRARE, qualunque cosa io voglia, ma voglio essere in grado di scegliere COMPRARE o VENDERE nelle proprietà EA. Cioè metto per esempio BUY nelle sue proprietà e apre un ordine BUY only, o viceversa.

Sto allegando l'EA stesso.

Grazie in anticipo a tutti quelli che rispondono!


È improbabile che qualcuno risponda. L'EA è decompilato (hackerato) e tali file non sono i benvenuti qui...

 
WinExec("C:\\Program Files\\Opera\\opera.exe http://www.mail.ru",2);
Ciao a tutti, questo è lanciare il link con un browser specifico, ma come faccio a lanciare lo stesso link di default?
 
Cioè con il browser predefinito
 
Dimoncheg >> :
Cioè il browser predefinito

ShellExecute, il comando "aperto", per così dire.

 

Ho deciso di studiare MQL 4 poiché tutto quello che ho trovato non soddisfa le mie aspirazioni. Al momento sto studiando per capire come lavorano i professionisti e migliorarlo per la mia idea. C'è una funzione personalizzata (semplice e piccola, una pagina), il codice è allegato. A causa del mio dilettantismo, non posso per due giorni capire - cosa restituisce questa funzione come risultato, e quale condizione annidata è la Else?

Qualcuno vorrebbe piantare una scintilla di conoscenza nella mia ottusità?

Quello che ottengo è questo:

Lo scopo della funzione è determinare se c'è già un ordine piazzato per questa coppia e, se c'è, determinarne il tipo.

La funzione che ha chiamato questa funzione aspetta la presenza di uno degli ordini selezionati nella procedura interruttore, La funzione dovrebbe restituire "1", in presenza di due ordini - "2", e in assenza di ordini "-1".

Il ciclo viene avviato se l_pos_16= 0. Supponiamo di avere quattro ordini pendenti in totale per alcune coppie, inclusi due alla coppia in cui l'EA sta lavorando e non sono i primi.

Tuttavia, alla prima iterazione del ciclo, la funzione if(OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) controlla la posizione con il numero "0" nella lista degli ordini, ma non c'è tale posizione (perché ho capito che la numerazione parte dalla posizione 1) e quindi passerà a quella successiva. else con uscita completa da fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12) con ritorno del valore Ritorno(-1).

Il senso della funzione nel suo insieme si perde, poiché il risultato dovrebbe essere lo stesso indipendentemente dalla presenza o assenza di ordini al simbolo dato .

Tuttavia, quando l'EA funziona, questa funzione definisce e dà ciò che la funzione chiamata si aspetta da essa, che poi lavora in funzione del risultato ottenuto .

Inoltre non capisco cosa altrimenti Ritorno(-1) funzionerà in

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

Oppure stesso in if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

Il codice della funzione :

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;

for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); 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_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_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++;

}

}

} else return (-1);

}

ritorno (a_count_0 + a_count_4 + a_count_8 + a_count_12);

/* l'esecuzione normale di f-i restituirà uno nella variabile in uno dei caso e "0" in tutti gli altri, che indica che c'è uno di

dei tipi di ordine, e il numero di questo ordine è disponibile per la funzione chiamante,

commento, prezzo aperto, stop loss e take profit */

}