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

 
neverness:

Ho già descritto il compito più semplice.

Aprire MetaEditor.

Cliccate su File->Create.

Nel campo a comparsa selezionare Indicatore.

...

Ma questo codice non è accettato dal traduttore MQL.

Risponderò tra circa 20 minuti

 
neverness:

Cosa state facendo voi bambini, in realtà, a smuovere le acque?

Nessuno fa storie. La situazione comincia finalmente a schiarirsi un po'. Si scopre che si chiama script una funzione che non può essere messa nel corpo del codice principale.

Inoltre non dimenticate che MT è destinato a lavorare con denaro che deve essere protetto dagli attacchi di terzi. Da qui la maggior parte delle limitazioni della lingua.

mai:

Ho già descritto un compito semplice.

Aprire MetaEditor.

Cliccate su File->Create.

Nel campo a comparsa selezionare Indicatore.

Nell'indicatore OnCalculate() introduce qualsiasi oggetto script con l'evento OnStart().

Personalmente non so come fare. Beh, per esempio così:

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
for(int i = 1; i < 100;i++)

{

se(open[i] > Max)

{

OnStart()

E qui scriviamo uno script per costruire l'oggetto che ci interessa. Per esempio, un'ellisse o una lettera su un grafico o qualcos'altro

} //if(open)

} //for(int i)
//--- restituire il valore di prev_calculato per la prossima chiamata
return(rates_total)
} // OnCalculate

Dovrebbe avere un aspetto simile a questo.

Ma il traduttore MQL non percepisce tale codice.

Dovrebbe assomigliare a questo

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
for(int i = 1; i < 100;i++)
      {
      if(open[i] > Max)
            {
            
           if(int  ObjectFind(chart_id, /* идентификатор графика*/ object_name/* имя объекта*/) < 0)
            ObjectCreate(Здесь параметры функции согласно документации.
                         Например, эллипса, или буквы на графике, или еще чего-нибудь);
               
            }  //if(open)
      }  //for(int i)  
//--- return value of prev_calculated for next call
   return(rates_total);
  } // OnCalculate
 
Vitaly Muzichenko:

Tra circa 20 minuti risponderò.

Ci è voluto molto tempo per caricare il video - oltre 40 minuti.


//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
 {
  EllipseCreate(0, "Ellipse", 0, 0, 0, 0, 0, 0, 0, clrRed, STYLE_SOLID, 1, true, true);
//--- indicator buffers mapping
   return(INIT_SUCCEEDED);

 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
 ArraySetAsSeries(time,true);
 ArraySetAsSeries(open,true);
 // ....
  ObjectMove(0, "Ellipse",0,time[1],open[5]);
  ObjectMove(0, "Ellipse",1,time[10],open[15]);
  ObjectMove(0, "Ellipse",2,time[20],open[25]);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

bool EllipseCreate(const long            chart_ID=0,        // ID графика 
                   const string          name="Ellipse",    // имя эллипса 
                   const int             sub_window=0,      // номер подокна  
                   datetime              time1=0,           // время первой точки 
                   double                price1=0,          // цена первой точки 
                   datetime              time2=0,           // время второй точки 
                   double                price2=0,          // цена второй точки 
                   datetime              time3=0,           // время третьей точки 
                   double                price3=0,          // цена третьей точки 
                   const color           clr=clrRed,        // цвет эллипса 
                   const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий эллипса 
                   const int             width=1,           // толщина линий эллипса 
                   const bool            fill=false,        // заливка эллипса цветом 
                   const bool            back=false,        // на заднем плане 
                   const bool            selection=true,    // выделить для перемещений 
                   const bool            hidden=true,       // скрыт в списке объектов 
                   const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- установим координаты точек привязки, если они не заданы 
  // ChangeEllipseEmptyPoints(time1,price1,time2,price2,time3,price3); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим эллипс по заданным координатам 
   if(!ObjectCreate(chart_ID,name,OBJ_ELLIPSE,sub_window,time1,price1,time2,price2,time3,price3)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать эллипс! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим цвет эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль линий эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину линий эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); 
//--- включим (true) или отключим (false) режим заливки эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим выделения эллипса для перемещений 
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); 
  } 
File:
Set.mq5  10 kb
 
Vitaly Muzichenko:

Ci è voluto molto tempo per caricare il video - più di 40 minuti.

A volte confondo anche le sezioni del forum e scrivo una risposta a una domanda su mql4 in mql5.

In linea di principio, in questo caso non cambierà nulla tranne l'estensione del file, ma in mql4 sarà superfluo

 ArraySetAsSeries(time,true);
 ArraySetAsSeries(open,true);

e anche completamente inutile e superfluo.

 
neverness:

Cosa state facendo voi bambini, in realtà, a smuovere le acque?

Basta andare nel MetaEditor e digitare il comando: File->Creare...

Questo farà apparire un modulo con diversi file fittizi.

In particolare, questi saranno i dongle:

- Consulente esperto

- Indicatore personalizzato

- Script

- Biblioteca, ecc.

Siamo interessati ai primi tre elementi: Expert Advisor, Custom Indicator e Script.

Confrontiamo questi manichini:

In Expert Advisor abbiamo degli eventi:

-OnInit(), OnDeinit(), OnTick(), OnTimer, OnChartEvent() ... tutto, niente più.

Nello script abbiamo gli eventi:

- OnStart() ... questo è tutto, niente di più.

nell'indicatore abbiamo degli eventi:

- OnInit(), OnCalculate(), OnTimer, OnChartEvent() ... tutto, niente più.

La domanda naturale qui è come fare il collegamento tra questi oggetti.

Si scopre che non c'è e non può esserci alcuna connessione tra loro in MQL, perché i flussi di dati tra questi oggetti sono completamente separati e non c'è alcuna connessione tra loro.

Inoltre, sono sorpreso dal fatto che i creatori di MQL ci danno questo fatto come un "bene".

E se, per esempio, in C++ posso facilmente chiamare il traduttore BASIC, o Javascript o qualsiasi altro traduttore, e andare nell'ambiente di programmazione Android, per esempio,

in MQL, non posso nemmeno creare un cosiddetto "script" nell'ambiente "indicatore", perché l'ambiente indicatore non accetta il comando OnStart().

Che razza di mostro è questo?

E ce ne sono più che a sufficienza di queste cose brutte in MQL.

Sono ad ogni passo.

Ho letto la descrizione di MQL - e sono sorpreso, perché non c'è altro da fare.

Per tutto il tempo i creatori di MQL proclamano a gran voce che MQL è un discendente di C++.

Certo, mi dispiace, ma voglio chiedere ai creatori di MQL: - Erede di cosa? - Nella sua bruttezza?


Paragono involontariamente MQL al famoso ambiente di programmazione 1C. Sostengono anche di essere gli eredi di C++.

Ma lì tutto è fatto in modo molto più decente.

E gli oggetti grafici, e la comunicazione tra i moduli e molto altro.

E cosa c'è in MQL?

Nessuna classe incorporata, nessun oggetto legato ai thread... e niente di niente.

E non ho detto nulla sul guscio matematico del terminale!!!

Questo è un argomento a parte per le sorprese!!!

Perché non leggi un po' di Aiuto e trovi tutte quelle cose che dici di non avere, leggi delle classi integrate in SB, impara a chiedere aiuto educatamente (hai chiesto aiuto) e impara a non essere scortese con le persone che cercano di aiutarti (nota che sono disinteressate)...

In generale - bannarti per 24 ore per trolling, maleducazione e accattonaggio (non hai mostrato una riga del tuo codice per dimostrare tutte le tue affermazioni, ma impudentemente richiedi alle persone che hanno risposto alla tua domanda e alle tue affermazioni, che ti forniscano codice funzionante per le tue esigenze - non è usuale qui - aiutano, non fanno per te, nota - il codice più semplice)

Senza offesa - chi viene da noi con niente sarà ucciso da qualcosa di incomprensibile.

Tanto più che ti ho avvertito di abbassare il riscaldamento:

 

come installare mt4 su macOS? aiuto per favore!

 

Esclusivamente in una macchina virtuale. Ho Parallel's, costoso ma conveniente e affidabile.

https://www.parallels.com/ru/products/desktop/

Запуск Windows на Mac — виртуальная машина Parallels Desktop 14 для Mac
  • www.parallels.com
Можно запустить Windows параллельно с macOS® (перезагрузка не требуется) на компьютерах MacBook®, MacBook Pro®, iMac®, iMac Pro®, Mac mini® или Mac Pro®. Предоставляйте общий доступ к файлам и папкам, копируйте и вставляйте текст и изображения, перетаскивайте файлы между приложениями Mac и Windows. Удобная настройка Parallels Desktop...
 

Sto chiedendo aiuto. Le domande sono:

1. Il programma non imposta gli stop loss sia in acquisto che in vendita in modalità test. Ma la modifica degli ordini in sospeso va bene.

2. Non parte in tempo reale sul conto.

Per favore, aiuto.

Vorrei anche chiedere di segnalare eventuali errori che possono essersi verificati durante la scrittura del programma.

Molte grazie in anticipo.

Codice del programma:

.input int Percent=50;

input int MAGICNUMBER=413;

//Introduzione di costanti e oscillatori di indicatori per i grafici a lungo termine

ingresso int Signal_Period_long_term=6;

input int Fast_EMA_Period_long_term=12;

input int Slow_EMA_Period_long_term=24;

//Impatto dei parametri degli indicatori e delle costanti degli oscillatori per i grafici a breve termine

input int Stochastic_Kperiod_short_term=5;

input int Stochastic_Dperiod_short_term=3;

input int Stochastic_slowing_short_term=3;

input ENUM_TIMEFRAMES PERIODs_short_term=PERIOD_M5;

input ENUM_TIMEFRAMES PERIODs_long_term=PERIOD_H1;

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

//variabili comuni e i loro tipi

static datetime New_Time;//ora della barra corrente

statico datetime Time_Local;

double Margin_Percent; //Utilizzato per l'apertura di ordini

double Lots;//Determinazione del numero totale di lotti

doppio Lotti_Volume;

/Variabili e tipi per il grafico a lungo termine

double MacdCurrent_long_term;//MACD parametri della linea principale della barra corrente

double MacdPrevious_long_term;//MACD parametri della linea principale della barra precedente

doppio SignalCurrent_long_term;

/Variabili e tipi per il grafico a breve termine

double Stochastic_Current_short_term_main;//Parametri stocastici della barra corrente sul grafico a 5 minuti

double Stochastic_Previous_short_term_main;//Parametri stocastici della barra precedente sul grafico a 5 minuti

double Stochastic_Current_short_term_signal;//Parametri stocastici della barra corrente nel grafico a 5 minuti

double Stochastic_Previous_short_term_signal;//Parametri stocastici della barra precedente sul grafico a 5 minuti

doppio StopLoss_BUY;

doppio StopLoss_SELL;

doppio Price_BUY;

doppio Price_SELL;

//+------------------------------------------------------------------+

//| Funzione di inizializzazione dell'esperto |

//+------------------------------------------------------------------+

int OnInit()

{

//---


//---

return(INIT_SUCCEED);

}

//+------------------------------------------------------------------+

//| Funzione di deinizializzazione dell'esperto |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

//---


}

//+------------------------------------------------------------------+

//| funzione tick esperto |

//+------------------------------------------------------------------+

void OnTick()

{

int biglietto,cnt;

int total=OrdersTotal();// Determinazione del numero di ordini

bool New_Bar=false; // Flag nuova barra


//Definizione dei valori delle variabili per il grafico a lungo termine

MacdCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,1);

MacdPrevious_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,2);

SignalCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_SIGNAL,1);

//Determinazione dei valori delle variabili per il grafico a breve termine

Stochastic_Current_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,1);

Stochastic_Previous_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,2);

Stochastic_Current_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,1);

Stochastic_Previous_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,2);

//Definizione delle variabili comuni

Price_BUY=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

Price_SELL=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

StopLoss_BUY=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

StopLoss_SELL=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);

Margin_Percent=AccountFreeMargin()*Percent/100;

Lotti=NormalizeDouble(Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);

Lots_Volume=NormalizeDouble(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP),2);

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

//----- Определение нового бара------------------------------------------------------------------------------------------

New_Time=TimeCurrent();

Print("Time=",TimeCurrent();

Print("Bar open time =",iTime(NULL,PERIODs_short_term,0));

if(iTime(NULL,PERIODs_short_term,0)==New_Time) // Confronta i tempi

{

if(iVolume(NULL,PERIODs_short_term,0)<=2) //compara il volume

Stampa("Volume della barra =",Volume[0]);

if(iBarShift(NULL,PERIODs_short_term,TimeCurrent())==0)//Controlla l'indice della barra

Print("Bar index =",iBarShift(NULL,PERIODs_short_term,TimeCurrent());

New_Bar=true; // Viene catturata una nuova barra

Stampa("New_Bar");

}

else if(New_Bar==false) // Se la barra non è nuova...

{

Stampa("La barra non è nuova");

ritorno;

}

//---Controllare la disponibilità di fondi per l'apertura del lotto minimo

if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))

{

Print("Non ci sono abbastanza fondi. Fondi liberi = ",AccountFreeMargin());

ritorno;

}

//---Determinazione del numero dei lotti

se(Lotti>Lotti_Volume)

{

Lots=NormalizeDouble(Lots_Volume,2);

Stampa("Numero di lotti: ",Lotti);

}

else if(Lotti<Lotti_Volume)

{

Lots=NormalizeDouble(MathFloor(Lots),2);

Stampa("Numero di lotti: ",Lotti);

}

//+------------------------------------------------------------------+

//| Condizioni di apertura degli ordini se il numero di ordini è uguale a zero |

//+------------------------------------------------------------------+

se(totale<1)

{


if(MacdCurrent_long_term<0 && MacdCurrent_long_term>SignalCurrent_long_term)

Print("Condition is true for BUY");

{

//+---------------------------------------------------------------------------+

//| Condizione per aprire una posizione long BUY solo

//+---------------------------------------------------------------------------+

if(Stochastic_Current_short_term_main<Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main>=Stochastic_Previous_short_term_signal)

{

ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,3,0,0,NULL,MAGICNUMBER,0,Blue);

if(ticket>0)//controlla la posizione aperta

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

{

Print("BUY order open : ",OrderOpenPrice());

ritorno;

}

else Print("BUY order open error : ",GetLastError());

ritorno;

}

}

}

if(MacdCurrent_long_term>0 && MacdCurrent_long_term<SignalCurrent_long_term)

Print("La condizione è vera per SELL");

{

//+---------------------------------------------------------------------------+

//| Condizione per l'apertura di posizioni short SELL solo

//+---------------------------------------------------------------------------+

if(Stochastic_Current_short_term_main>Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main<=Stochastic_Previous_short_term_signal)

{

ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Price_SELL,3,0,0,NULL,MAGICNUMBER,0,Green);

if(ticket>0)//controlla la posizione aperta

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

{

Print("SELL order open : ",OrderOpenPrice());

ritorno;

}

else Print("Error opening SELL order : ",GetLastError());

ritorno;

}

}

}

}


//+---------------------------------------------------------------------------+

//| Condizioni di modifica dell'ordine

//+---------------------------------------------------------------------------+


for(cnt=0;cnt<totale;cnt++)

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

{

if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))

continuare;

if(OrderMagicNumber()==MAGICNUMBER && // controlla il numero magico dell'ordine

OrderSymbol()==Symbol()) // controlla il simbolo dell'ordine

{

//--- posizione lunga aperta

se(OrderType()==OP_BUYSTOP)

{

if(OrderOpenPrice()<Price_BUY && Ask<Price_BUY)

{

if(OrderModify(OrderTicket(),Price_BUY,0,0,0,0,Blue))

Print("L'ordine Price_BUY è stato modificato con successo");

else Print("Errore nella modifica dell'ordine BUYStop. Codice di errore=",GetLastError());

ritorno;

}

else Print("Il prezzo di modifica è superiore al prezzo dell'ordine");

ritorno;

}

se(OrderType()==OP_SELLSTOP)

{

if(OrderOpenPrice()<Price_SELL && Bid>Price_SELL)

{

if(OrderModify(OrderTicket(),Price_SELL,0,0,0,Green))

Print("L'ordine Price_SELL è stato modificato con successo");

else Print("Errore nella modifica dell'ordine SELLStop. Codice di errore=",GetLastError();

ritorno;

}

}

if(OrderType()==OP_BUY)

{

if(OrderStopLoss()<StopLoss_BUY && StopLoss_BUY<Ask)

{

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_BUY,0,0,Blue))

Print("Price_BUY order price successfully modified.");

else Print("Errore nella modifica dell'ordine BUY. Codice di errore=",GetLastError());

ritorno;

}

}

if(OrderType()==OP_SELL)

{

if(OrderStopLoss()>StopLoss_SELL && StopLoss_SELL>Bid)

{

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))

Print("Price_SELL order price successfully modified.");

else Print("Errore nella modifica dell'ordine SELL. Codice di errore=",GetLastError();

ritorno;

}

}

}

}


}

//+------------------------------------------------------------------+

 

Aiuta a risolvere un bug nell'indicatore, non disegna il massimo e il minimo del giorno quando è sull'ultima candela dell'ora.

https://prnt.sc/kut6xo

https://prnt.sc/kut79b

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
File:
 
Michail_David:

Sto chiedendo aiuto. Le domande sono:

1. Il programma non imposta gli stop loss sia in acquisto che in vendita in modalità test. Ma la modifica degli ordini in sospeso va bene.

2. Non parte in tempo reale sul conto.


Questo è il modo in cui

 if(OrderType()==OP_SELL)

           {

            if(OrderStopLoss()!= StopLoss_SELL && StopLoss_SELL>Bid)

modificherà il codice AND, inserendolo correttamente (Alt+S).

Motivazione: