Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1632

 
amsgif80 #:

Questo è il codice che ho cercato di inserire:

Nella parte superiore del codice lanciare questo:
enum ENUM_DIRECTION{
DIRECTION_BUY = 0, // comprare solo
DIRECTION_SELL = 1, // vendere solo
DIRECTION_ANY = 2, // comprare e vendere
};

input ENUM_DIRECTION inp_direction = DIRECTION_ANY; // direzione commerciale consentito


ulteriormente trovare dove nel codice si apre comprare e dove vendere. Guarda dentro la funzione start() o OnTick()
dove buy è nelle condizioni aggiungere:
if(inp_direction!=DIRECTION_SELL)
dove sell è nelle condizioni aggiungere:
if(inp_direction!=DIRECTION_BUY )

Dove l'hai messo?
 
MakarFX #:
Dove l'hai messo?
//+------------------------------------------------------------------+
//| Medie mobili.mq5 |
//| Copyright 2009-2013, MetaQuotes Software Corp.
//+------------------------------------------------------------------+





#property copyright "Copyright 2009-2013, MetaQuotes Software Corp.
#proprietà link"https://www.mql5.com"
#proprietà versione "1.00"

enum ENUM_DIRECTION{
DIRECTION_BUY = 0, // solo acquisto
DIRECTION_SELL = 1, // solo vendita
DIRECTION_ANY = 2, // comprare e vendere
};

input ENUM_DIRECTION inp_direction = DIRECTION_ANY; // direzione commerciale consentita

#include <Trade\Trade.mqh>

input double MaximumRisk = 0.02; // rischio massimo in percentuale
input double DecreaseFactor = 3; // fattore di decremento
input int MovingPeriod = 12; // periodo della media mobile
input int MovingShift = 6; // spostamento della media mobile



//---
int ExtHandle=0;


//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'esperto |
//+------------------------------------------------------------------+




int OnInit(void)
{
//---
ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
se(ExtHandle==INVALID_HANDLE)
{
printf("Errore nella creazione dell'indicatore MA");
return(INIT_FAILED);
}
//---
return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| funzione tick esperto |
//+------------------------------------------------------------------+
void OnTick(void)
{
//---
se(PositionSelect(_Symbol))
CheckForClose();
else
CheckForOpen();
//---
}
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione esperto |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Calcolare la dimensione ottimale del lotto
//+------------------------------------------------------------------+
doppio TradeSizeOptimized(void)
{
doppio prezzo=0,0;
doppio margine=0.0;
//--- calcolare la dimensione del lotto
if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
ritorno(0.0);
if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
ritorno(0.0);
se(margine<=0.0)
ritorno(0.0);

double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/margin,2);
//--- calcolare la lunghezza di una serie di operazioni perdenti ininterrotte
se(Fattore di diminuzione>0)
{
//--- richiedere l'intera storia del trading
HistorySelect(0,TimeCurrent());
//--
int orders=HistoryDealsTotal(); //numero totale di scambi
int perdite=0; // numero di trade perdenti nella serie

for(int i=ordini-1;i>=0;i--)
{
ulong ticket=HistoryDealGetTicket(i);
se(ticket==0)
{
Print("HistoryDealGetTicket failed, no trade history");
pausa;
}
//--- controllare il simbolo commerciale
if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
continuare;
//--- controllare il profitto
double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
se(profitto>0.0)
pausa;
se(profitto<0.0)
perdite++;
}
//---
se(perdite>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//--- normalizzare e controllare i valori ammissibili del volume degli scambi
double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
lot=stepvol*NormalizeDouble(lot/stepvol,0);

double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
se(lotto<minvol)
lotto=minimo volume;

double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
se(lotto>maxvol)
lotto=maxvol;
//- restituisce il valore del volume di scambio
ritorno(lotto);
}


//+------------------------------------------------------------------+
//| Controlla le condizioni di posizione aperta
//+------------------------------------------------------------------+
void CheckForOpen(void)
{
MqlRates rt[2];
//--- copiare i valori dei prezzi
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
ritorno;
}
//-trade solo al primo tick della nuova barra
se(rt[1].tick_volume>1)
ritorno;
//- ottenere il valore corrente dell'indicatore della media mobile
doppio ma[1];
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
{
Print("CopyBuffer from iMA failed, no data");
ritorno;
}
//--- controllo del segnale
ENUM_ORDER_TYPE signal=WRONG_VALUE;

if(rt[0].open>ma[0] && rt[0].close<ma[0])
signal=ORDER_TYPE_SELL; // condizione per vendere if(inp_direction!=DIRECTION_BUY)
else
{
if(rt[0].open<ma[0] && rt[0].close>ma[0])
signal=ORDER_TYPE_BUY; // condizione per comprare if(inp_direction!=DIRECTION_SELL)
}
//--- controlli aggiuntivi
se(segnale!=WRONG_VALUE)
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
se(Bars(_Symbol,_Period)>100)
{
Commercio CTrade;
trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK,)
0,0);
}
//---
}
//+------------------------------------------------------------------+
//| Controlla le condizioni di chiusura della posizione |
//+------------------------------------------------------------------+
void CheckForClose(void)
{
MqlRates rt[2];
//--- copiare i valori dei prezzi
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
ritorno;
}
//-trade solo al primo tick della nuova barra
se(rt[1].tick_volume>1)
ritorno;
//- ottenere il valore corrente dell'indicatore della media mobile
doppio ma[1];
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
{
Print("CopyBuffer from iMA failed, no data");
ritorno;
}
//--- ottenere il tipo di posizione, selezionata in precedenza attraverso la PositionSelect().
bool signal=false;
long type=PositionGetInteger(POSITION_TYPE);

if(type==(long)POSITION_TYPE_BUY && rt[0].open>ma[0] && rt[0].close<ma[0])
segnale=vero;
if(type==(long)POSITION_TYPE_SELL && rt[0].open<ma[0] && rt[0].close>ma[0])
segnale=vero;
//--- controlli aggiuntivi
se(segnale)
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
se(Bars(_Symbol,_Period)>100)
{
Commercio CTrade;
trade.PositionClose(_Symbol,3);
}
//---
}
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 

Questa sezione dovrebbe essere così

 //--- проверка сигналов
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0])
     {
      if(inp_direction!=DIRECTION_BUY)
         signal=ORDER_TYPE_SELL;
     }
   else
     {
      if(rt[0].open<ma[0] && rt[0].close>ma[0])
        {
         if(inp_direction!=DIRECTION_SELL)
            signal=ORDER_TYPE_BUY;
        }
     }
 //--- дополнительные проверки 
 
MakarFX #:

Questa sezione dovrebbe essere così.

Makar, questo.

      if(inp_direction==DIRECTION_SELL||inp_direction==DIRECTION_ANY)

è meglio sostituirlo con questo.

      if(inp_direction!=DIRECTION_BUY)
 
Alexey Viktorov #:

Makar, questo

è meglio sostituirlo con questo.

Sostituito)
 
MakarFX #:

Questa sezione dovrebbe essere così

Grazie dal profondo del mio cuore! Ha funzionato tutto in una volta, sta funzionando. E mi sono già scervellato su come farlo))

 
Posso farti di nuovo la stessa domanda, ma sul mio semplice EA generato dall'editor? Ho pensato che ora riuscirò a farlo da solo, ma non so dove mettere questo codice Buy/Sell. Non so dove incollare questo codice Buy/Sell.
 
amsgif80 #:
Posso farti di nuovo la stessa domanda, ma sul mio semplice EA generato dall'editor? Ho pensato che ora riuscirò a farlo da solo, ma non è così facile. Non riesco a capire dove incollare questo codice Buy/Sell.
Mostrami
 
amsgif80 #:

Ti ho mostrato come inserire il codice nel forum


 
MakarFX #:

Non hai cambiato nulla.

il tuo appello

è all'interno.

Makar grazie per il suggerimento