[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 402

 
hoz:

Vadim, io lo farei nel modo che hai descritto! Per questo ti ho fatto una domanda. Ho pensato che forse non ho tenuto conto di qualcosa. Sto ancora osservando la mia logica e quella degli altri programmatori. Perché oltre alla logica di base, vedo che devo prendere in considerazione una serie di fattori.

RefreshRates() aggiorna la storia nel thread esperto. MarketInfo() prende i dati dal server. Non c'è bisogno di rinfrescarlo. È un freno inutile.

Se deve essere aggiornato, una semplice chiamata di RefreshRates() non darà nulla. Dobbiamo in qualche modo controllare e gestire l'evento dell'arrivo di tutta la storia.

 
Ciao, come si usa metaeditor?
 
crespo1985:
ciao come usare metaeditor?


Beh, ciao! Usatelo come volete! Questo non è il tuo posto per fare domande del genere... Questo è un forum di programmatori...

Zhunko:

RefreshRates() aggiorna la cronologia nel thread di Expert Advisor. MarketInfo() prende i dati dal server. Non ha bisogno di essere aggiornato. È una frenata inutile.

Se deve essere aggiornato, una semplice chiamata di RefreshRates() non può fare nulla. Dobbiamo controllare e gestire tutti gli eventi storici in qualche modo.

Sì. Ho capito che RefreshRates() aggiorna i dati di mercato (la loro storia fino all'ora attuale) e poi la variabile di mercato usa l'ultimo valore ricevuto. Per quanto ho capito, questa è l'unica variante logica. Quindi, questa funzione è scritta più facilmente e più velocemente, e più logica e pratica, e più affidabile, non è vero?

double fGet_TradePrice(int fi_price,    // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
   double ld_price = 0.0;
   
   switch (fi_price)
   {
         case 0:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);
         
         case 1:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Ask;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_ASK);
   }
}
 
hoz:

Sì. Ho capito che RefreshRates() aggiorna i dati di mercato (la sua storia fino all'ora corrente), e poi la variabile d'ambiente del mercato usa l'ultimo valore ricevuto. Per quanto ho capito, questa è l'unica variante logica. Quindi, questa funzione sarebbe scritta più facilmente e più velocemente e più logica, più pratica e affidabile, giusto?

Io farei così:

double TradePrice(int    nPriceId, // Цена: 0 - Bid; 1 - Ask
                  string sSymbol)  // валютная пара
 {
  switch (nPriceId)
   {
    case 0: return(MarketInfo(sSymbol, MODE_BID));
    case 1: return(MarketInfo(sSymbol, MODE_ASK));
    default: Print("Ошибка и прочее...");
   }
  return(0);
 }

Una funzione separata dovrebbe essere scritta per aggiornare la storia.

 

2 ore cercando di scrivere un pezzo di prova, per testare ulteriormente diverse condizioni.

Non funziona!

Per favore, datemi l'errore.

int mm;


if (mm==0) { B=Bid; mm=1;} 

OrderSelect(0,SELECT_BY_POS,MODE_TRADES); 

if ( (Bid> B+0.0002 ) && (OrdersTotal()==0 || OrderType()==OP_SELL) ) { My_close(); My_buy (); My_modify(); }  

if ( (Bid< B-0.0002 ) && (OrdersTotal()==0 || OrderType()==OP_BUY ) ) {My_close(); My_sell (); My_modify(); }
  

il punto è che gli ordini si aprono dopo 2pp nella loro stessa direzione.

apre vendere e finisce...

 

Buona giornata! Perdonate la banalità. Le linee sono di un robot, ho avuto il robot per anni e fondamentalmente un ciclo di questo tipo vaga invariabilmente da uno all'altro.

 for(int i=OrdersTotal()-1;i>=0;i--) 
      {  if(OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)

Perché il totale del mio ordine è meno uno? È vero che il ciclo va per una diminuzione della variabile e?

 

La funzione di Kim ha il parametro time ="Data e ora in secondi dal 1970"

Ho provato 2 varianti.

ed entrambi danno un profitto non per il giorno corrente, ma un profitto completo su tutta la storia....

int t=(     TimeCurrent()-( (Hour()*3600) +(Minute()*60)+Seconds()   ) ); 
int t=(    (Hour()*3600) +(Minute()*60)+Seconds()    ); 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 
Dimka-novitsek:

Buona giornata! Perdonate la banalità. Le linee sono di un robot, ho avuto il robot per anni e fondamentalmente un ciclo di questo tipo vaga invariabilmente da uno all'altro.

Perché il totale del mio ordine è meno uno? È vero che il ciclo va per una diminuzione della variabile e?

Il ciclo conta un indice da 0 a Total-1 o da Total-1 a 0. Ecco perché ha bisogno di un segno meno o un segno meno < .
 
Zhunko:

Io lo farei:

double TradePrice(int    nPriceId, // Цена: 0 - Bid; 1 - Ask
                  string sSymbol)  // валютная пара
 {
  switch (nPriceId)
   {
    case 0: return(MarketInfo(sSymbol, MODE_BID));
    case 1: return(MarketInfo(sSymbol, MODE_ASK));
    default: Print("Ошибка и прочее...");
   }
  return(0);
 }

Ricevere i dati tramiteMarketInfo() anche per questo strumento a finestra sarebbe troppo costoso in termini di risorse, non credi?

Zhunko:

Dovreste scrivere una funzione separata per aggiornare la cronologia.


Non capisco bene la logica di scrivere una funzione separata. La stessa funzione RefreshRates() aggiorna i dati delle variabili predefinite. E Bid e Ask sono variabili predefinite. Se la funzione RefreshRates() aggiorna le variabili predefinite, perché scrivere una funzione aggiuntiva?
 
Grazie!!!