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

 
La richiesta del grafico è simile a CopyRates ArrayCopySeries, non RefreshRates. CopyRates è l'unica funzione non commerciale che muove il server.
 
Zhunko:
Quando apri e aggiorni il grafico, una richiesta di nuovi dati va al server. Alcune avide società di brokeraggio preferiscono spendere i loro soldi per le loro tasche piuttosto che per server più potenti e un canale più ampio. Devono limitare il numero di richieste dal terminale in modo che un server debole non venga "bloccato". MRC ha solo 2000 richieste al giorno. È 10 volte meno del numero dei loro strumenti moltiplicato per il numero di TF, senza contare le richieste di trade.
Beh, dobbiamo evitare queste cucine. Questa è la prima volta che sento cose negative su MRC. Resta da vedere se solo il terminale o se le funzioni (tranne il trading) accedono anche al server. Ho fatto questa domanda al supporto (l'ho scritto sopra, ancora nessuna risposta). Se non solo, allora tutto cade a posto, e se solo il terminale, allora tutto va fuori assurdo quel tipo di terminale è in esecuzione e contatterà il server per aggiornare le quotazioni, superare il limite senza trading. Penso che sia inadeguato, eppure le funzioni, come ha detto Viktor, tranne il trading, non accedono al server.

Zhunko:

Incluse in MQL4 aiutano a snellire il codice. Per esempio, ecco come appare un indicatore per 3000 linee nel mio codice.

Il fatto è che ho visto librerie, ed è menzionato nella documentazione, che gli inludi sono di solito posti all'inizio del codice, dove sono dichiarate le variabili globali. Se ci sono funzioni negli inludi, sembra strano pensare che in un posto in cui sono dichiarate variabili globali ci sarà di fatto una funzione in quel posto, e in alternativa, qualche tipo di variabile. Non è così che il codice è scritto. Se le variabili utilizzate nell'Expert Advisor e le variabili esterne personalizzate sono dichiarate in alto, nessuno mette funzioni accanto a loro! Ma mettono gli inludi con le funzioni, ed è considerato normale, da quanto ho capito. Questo è ciò che mi confonde di più.

Non sembra logico...

D'altra parte, se si mette un inline, da qualche parte. invece di diverse funzioni, che sono responsabili di ottenere, diciamo, un segnale di scambio per qualche attributo, sarebbe una cosa logica e leggibile.

Zhunko:

Sfortunatamente, il compilatore non permette che un'inclusione sia usata più di una volta in un modulo. Questo è di solito un modo per risparmiare sul codice ripetitivo.

Questa è una piccola cosa. Dopo tutto, la cosa principale è mettere le funzioni principali ingombranti e i frammenti di codice fuori dal codice principale, e chiamarli tramite l'inline. E poi si può chiamare la funzione, che si è delineata, per nome di funzione... E non dovrete preoccuparvi di questa restrizione.
 

Buon pomeriggio a tutti.

Studio delle funzioni MarketInfo ( ) e Print( )

Ecco un semplice codice che usa queste funzioni

Tester, TF 60 min.

double T ;
int start()
{
 T = MarketInfo("EURUSD",MODE_HIGH); // в глобальную переменную Т запоминаем максимум дневной свечи,который должна возвращать  MarketInfo ( )
Print (" corresponds to ", T );           //
if ( T > iHigh( Symbol (), 0,10))  // если максимум текущей дневной свечи > High свечи N10(ТФ60 мин)
OrderSend(Symbol(),OP_SELL,0.1,Bid,1,0,0,"jfh",123 ); открыть ордер
}                                                                                                                       
return;

ПРОБЛЕМА 1.Ордер не открывается 2.Print() постоянно возвращает 0 ПРИМЕЧАНИЕ. Для открытия ордера - мне нужной сравнивать параметры свечей разных ТФ(60 мин и 1440 мин.) Подскажите пожалуйста как это можно сделать. Спасибо.

 
Integer:
La richiesta del grafico sembra la richiesta CopyRates ArrayCopySeries e non quella RefreshRates. CopyRates è l'unica funzione non commerciale che muove il server.

Controllato RefreshRates(). Se questo Expert Advisor viene eseguito, per esempio, su EURUSD, e un altro strumento la cui finestra non è stata aperta per molto tempo viene inserito nelle impostazioni (in modo che la cronologia non ci sia), la cronologia appare.

extern string Tool           = "AUDNZD"; // Имя инструмента.
extern bool   IsRefreshRates = true;     // Флаг включения обновления таймсерий.
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
 {
  string sTool = Tool; // Имя инструмента.
  if (Tool == "") sTool = Symbol();
  while (!IsStopped())
   {
    if (IsRefreshRates) RefreshRates();
    string sComment = StringConcatenate("MarketInfo()\n",
                                        TimeToStr(MarketInfo(sTool, MODE_TIME), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(MarketInfo(sTool, MODE_BID), Digits), "  ", DoubleToStr(MarketInfo(sTool, MODE_ASK), Digits),
                                        "\n\nПредопределенные переменные\n",
                                        TimeToStr(Time[0], TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(Bid, Digits), "  ", DoubleToStr(Ask, Digits),
                                        "\n\nМассивы-таймсерии\n");
    for (int i = 0; i < 10; i++)
     {
      sComment = sComment + StringConcatenate(TimeToStr(iTime(sTool, 0, i), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "  ",
                                              DoubleToStr(iOpen(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iLow(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iHigh(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iClose(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iVolume(sTool, 0, i), 0), "\n");
     }
    Comment(sComment);
    Sleep(300);
   }
 }

Quindi, RefreshRates() fa riferimento al server e scarica la cronologia. Di conseguenza, è necessario controllare l'arrivo della storia.

Il supporto dice che nessuna delle funzioni si riferisce direttamente al server. Tutto viene eseguito attraverso il terminale :-).

 
TarasBY:
Se usate GetProfitFromDateInCurrency() (originale - questo è IMPORTANTE: non so cosa potreste aver ottenuto nella vostra versione), allora la funzione dovrebbe essere chiamata così:

e la funzione restituirà i profitti sugli ordini chiusi dall'inizio del giorno corrente.

E potete catturare tutte le cose stupide nel codice usando Print().


non funziona. Mostra tutti i profitti disponibili sulle transazioni per l'intera storia.

Ecco la funzione originale e non ho cambiato nulla in essa, ovviamente

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  int    i, 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=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

ecco la sua chiamata e stampa

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );
 
Zhunko:

Controllato RefreshRates(). Se questo Expert Advisor viene eseguito, per esempio, su EURUSD, e un altro strumento la cui finestra non è stata aperta per molto tempo viene inserito nelle impostazioni (in modo che la cronologia non ci sia), la cronologia appare.

Quindi, ancora RefreshRates() si riferisce al server e riempie la storia. Di conseguenza, è necessario controllare l'arrivo della storia.

Il supporto dice che nessuna delle funzioni si riferisce direttamente al server. Quindi, tutto viene fatto attraverso il terminale :-)


Vadim, ho eseguito il tuo script su un terminale sul quale non ho mai aperto alcuno strumento a parte le major e i cross con lo yen. Comunque, ecco uno screenshot:

Non viene pompato nulla perché la matrice dei dati di mercato è vuota, a giudicare dai commenti...

 
hoz:


Vadim, ho eseguito il tuo script su un terminale sul quale non ho mai aperto alcuno strumento a parte le major e i cross con lo yen. Comunque, ecco uno screenshot:

Non si sta pompando nulla perché la matrice dei dati di mercato è vuota, a giudicare dai commenti...


Sì. Non ha anche notato che ha MarketInfo() nel suo Expert Advisor e non solo RefreshRates().
 
Zhunko:

Controllato RefreshRates(). Se questo Expert Advisor viene eseguito, per esempio, su EURUSD, e un altro strumento la cui finestra non è stata aperta per molto tempo viene inserito nelle impostazioni (in modo che la cronologia non ci sia), la cronologia appare.

Quindi, ancora RefreshRates() si riferisce al server e riempie la storia. Di conseguenza, è necessario controllare l'arrivo della storia.

Il supporto dice che nessuna delle funzioni si riferisce direttamente al server. Quindi, tutto viene fatto attraverso il terminale :-)


Il livello di immaginazione è impressionante. Perché i dati sono apparsi solo per alcuni simboli (che non sono stati aperti) e non per tutti nella revisione del mercato? Come faceva la funzione RefreshRates() a sapere che alcuni simboli dovevano essere aggiornati e altri no?

Junko, smetti di divagare.

 
lottamer:


non funziona. Emette tutti i profitti disponibili sulle compravendite nell'intera storia.

Ecco la funzione originale e non ho cambiato nulla in essa, ovviamente

ecco la sua chiamata e la sua stampa

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );

Quindi tutto è corretto. Tu "leggi" la funzione riga per riga e capisci come funziona, se sei troppo annoiato per scriverla da solo, e tutto andrà a posto...

Avete un parametro di funzione:

iTime (NULL, PERIOD_D1, 0)

è l'ora di apertura dell 'ultima barra del giorno, cioè tutte le posizioni chiuse prima dell'apertura della barra del giorno corrente saranno calcolate e sommate! Ha senso? Quindi fissate un'altra barra, che è richiesta o qualunque cosa sia. Ma dovete vedere voi stessi.

 
Integer:

Sì. Inoltre non ha notato che ha MarketInfo() nel suo Expert Advisor, non solo RefreshRates().


Anche tutte le funzioni:


DoubleToStr(iOpen(sTool, 0, i), Digits), ",
DoubleToStr(iLow(sTool, 0, i), Digits), ",
DoubleToStr(iHigh(sTool, 0, i), Digits), " ",
DoubleToStr(iClose(sTool, 0, i), Digits), ",
DoubleToStr(iVolume(sTool, 0, i), 0), "\n");

Naturalmente, i dati saranno aggiornati.

Motivazione: