Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 1097

 
alvlaf:

L'ultimo codice che hai dato è un passo avanti - non apre nessuna operazione (quindi il divieto è in vigore). Non ho ancora capito perché nessuno. In allegato c'è uno screenshot del log.

All'inizio, la variabile si chiamava ProfitableSerie e aveva una funzione opposta. E ho qualcos'altro da aggiungere.

int OnInit()                     // abeiks && LRA: замечания приняты)))
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);
   return(INIT_SUCCEEDED);
}

// OnDeinit больше не нужен

void OnTick()
{
   if (CountTrades() == 0) // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
         return;
      }
      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 
      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
         return;
      }
      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер
      {
         if (GlobalVariableGet("AllowNewOrders") > 0) return;
         if (SignalBuy() && MaxOpenOrders > OrdersTotal())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
            return;
         }
         if (SignalSell() && MaxOpenOrders > OrdersTotal())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
            return;
         }
      }
      GlobalVariableSet("AllowNewOrders", 1);
   }
}

Prova in questo modo. Ho la sensazione che verrà fuori qualcos'altro...

 
Ciao a tutti, ho iniziato a leggere il tutorial MQL4 (voglio imparare a programmare), ma è una vecchia versione, cosa mi consigliate di fare? Leggere il tutorial e poi la documentazione?
 
LRA:
// ИХМО так нагляднее
D'accordo!
 
linar:

Ciao, ho iniziato a leggere il tutorial MQL4 (voglio imparare a programmare), ma è una vecchia versione, cosa mi consigliate di fare?

Se avete mai programmato in C, è meglio guardare il codice sorgente di indicatori gratuiti, indicatori più semplici e Expert Advisors e leggere la guida.

Se non avete programmato affatto, allora... Se non sapete programmare affatto, allora leggete la documentazione. )))

C'è anche un tutorial su questo forum: https://www.mql5.com/ru/forum/108883

 
A13ksandr:

È solo che all'inizio la variabile si chiamava ProfitableSerie e aveva la funzione opposta. E c'è un'altra cosa da aggiungere.

Prova in questo modo. Ho la sensazione che verrà fuori qualcos'altro...

Un altro passo avanti: il bot ha aperto un solo trade, ma è la fine. Non si apre nient'altro e non c'è nemmeno un messaggio nel log su qualche tentativo...
 
alvlaf:
Un altro passo avanti: il bot ha aperto un solo scambio, ma è stata la fine. Il bot non apre nient'altro e non ci sono messaggi nel log su eventuali tentativi...

Volevo mettere solo una parte del codice correttamente, ma poi ho copiato tutto il codice e non ho risolto l'errore. Dovrebbe essere così nell'ultima condizione.

         if (GlobalVariableGet("AllowNewOrders") == 0) return;

Ma in realtà non avrebbe dovuto fare un solo accordo allora. Alcune delle prime due condizioni non funzionano correttamente. Fissa la condizione per ora, vediamo :)

Updade: riporta OnDeinit per ogni evenienza.

void  OnDeInit()
{
   GlobalVariableSet("AllowNewOrders",1); 
} 
 
A13ksandr:

Accidenti, in origine volevo inserire solo una parte del codice corretto, ma poi ho copiato tutto e non ho corretto questo errore. Dovrebbe essere così nell'ultima condizione

Ma in realtà non avrebbe dovuto fare un solo accordo allora. Alcune delle prime due condizioni non funzionano correttamente. Fissa la condizione per ora, vediamo :)

Aggiornare: riportare OnDeinit per ogni evenienza.


Provato, dopo un trade in meno ha iniziato ad aprire una posizione su ogni tick.
 
alvlaf:
Provato, dopo un trade in meno ha iniziato ad aprire una posizione su ogni tick.

Metti le prime due condizioni sulla prima linea

if(GlobalVariableGet("AllowNewOrders") == 1) return;

E prova il primo test su una coppia.

Il broker GrandCapital?

 
A13ksandr:

Metti le prime due condizioni sulla prima linea

if (GlobalVariableGet("AllowNewOrders") == 1) return;

E prova il primo test su una coppia.

Broker GrandCapital?

//----------------------------------------------------------------------
int OnInit()
{
se (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);
return(INIT_SUCCEED);
}

//----------------------------------------------------------------------

void OnDeInit()
{
GlobalVariableSet("AllowNewOrders",1);
}
//----------------------------------------------------------------------

void OnTick()
{
if (GlobalVariableGet("AllowNewOrders") == 1) return;
{
if (CountTrades() == 0) // Il numero di ordini deve essere uguale a zero
{
se ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))
// Se l'ultimo trade è perdente, si apre lo stesso, ma con un lotto più grande
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
ritorno;
}
if (GlobalVariableGet("AllowNewOrders") == 1) return;
{
se (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// se il profitto dell'ultimo trade è uguale a zero, lo stesso trade sarà aperto
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
ritorno;
}
se (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))
|| CountHistTrades() == 0)// Se l'ultimo trade è redditizio, aprire l'ordine
{
if (GlobalVariableGet("AllowNewOrders") == 0) return;
se (SignalBuy() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
ritorno;
}
se (SignalSell() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
ritorno;
}
}
}
GlobalVariableSet("AllowNewOrders", 1);
}
}

}

Sì, Grande Capitale. L'hai messo bene? Ha smesso di aprire le transazioni di nuovo.

 

Ragazzi, mi sono già scervellato. Come faccio a fare in modo che l'EA piazzi ordini pendenti sui massimi e minimi, per esempio 8 candele, con un take profit di 1/4.

Faccio qualcosa del genere:

double Vhod1=iHighest(Symbol(),0,MODE_HIGH,8,0);

double Vhod2=iLowest(Symbol(),0,MODE_LOW,8,0);

doppio TP=((Vhod1-Vhod2)/4)+Vhod1;


Ho provato a cambiare i parametri, ma continua ad ottenere stop sbagliati o imposta il prezzo a 7.00000; non è chiaro da dove viene