[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 402

 
hoz:

Vadim, ich würde es so machen, wie du es beschrieben hast! Deshalb habe ich Ihnen eine Frage gestellt. Ich dachte, vielleicht habe ich etwas nicht bedacht. Ich beobachte immer noch meine eigene Logik und die Logik anderer Programmierer. Denn ich sehe, dass ich neben der grundlegenden Logik noch eine Reihe von Faktoren berücksichtigen muss.

RefreshRates() aktualisiert die Historie im Experten-Thread. MarketInfo() bezieht Daten vom Server. Es ist nicht notwendig, sie zu aktualisieren. Sie ist eine unnötige Bremse.

Wenn sie aktualisiert werden muss, wird ein einfacher Aufruf von RefreshRates() nichts bringen. Wir müssen das Ereignis der Ankunft der gesamten Geschichte irgendwie kontrollieren und handhaben.

 
Hallo, wie verwende ich den Meta-Editor?
 
crespo1985:
Hallo, wie benutzt man den Meta-Editor?


Na, hallo! Verwenden Sie es, wie Sie wollen! Dies ist nicht der richtige Ort, um solche Fragen zu stellen... Dies ist ein Forum für Programmierer...

Zhunko:

RefreshRates() aktualisiert den Verlauf im Thread des Expert Advisors. MarketInfo() bezieht Daten vom Server. Sie muss nicht aktualisiert werden. Das ist unnötiges Bremsen.

Wenn sie aktualisiert werden muss, kann ein einfacher Aufruf von RefreshRates() nichts ausrichten. Wir müssen alle geschichtlichen Ereignisse irgendwie kontrollieren und verarbeiten.

Ja. Ich verstehe, dass RefreshRates() die Marktdaten aktualisiert (ihre Historie bis zum aktuellen Zeitpunkt) und dann die Marktumgebungsvariable den zuletzt erhaltenen Wert verwendet. Soweit ich weiß, ist dies die einzige logische Variante. Daher ist diese Funktion einfacher und schneller zu schreiben und logischerweise auch praktischer und zuverlässiger, nicht wahr?

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:

Ja. Ich verstehe, dass RefreshRates() die Marktdaten aktualisiert (die Historie auf den aktuellen Zeitpunkt), und die Marktumgebungsvariable verwendet dann den zuletzt erhaltenen Wert. Soweit ich weiß, ist dies die einzige logische Variante. Daher wäre diese Funktion einfacher, schneller, logischer, praktischer und zuverlässiger zu schreiben, oder?

Ich würde folgendermaßen vorgehen:

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);
 }

Für die Aktualisierung der Historie sollte eine eigene Funktion geschrieben werden.

 

2 Stunden Versuch, ein Teststück zu schreiben, um verschiedene Bedingungen weiter zu testen.

Funktioniert nicht!

Bitte geben Sie mir den Fehler an.

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(); }
  

Der Punkt ist, dass Aufträge nach 2pp in ihrer eigenen Richtung geöffnet werden.

öffnet Verkauf und endet...

 

Guten Tag! Verzeihen Sie die Trivialität. Die Zeilen stammen von einem Roboter, den ich schon seit Jahren habe, und im Grunde wandert ein solcher Zyklus immer von einem zum anderen.

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

Warum ist der Gesamtbetrag meiner Bestellung minus eins? Stimmt es, dass die Schleife eine Verringerung der Variablen und anstrebt?

 

Kims Funktion hat den Parameter time ="Datum und Zeit in Sekunden seit 1970".

Ich habe 2 Varianten ausprobiert.

und beide ergeben einen Gewinn nicht für den aktuellen Tag, sondern einen vollen Gewinn über die gesamte Geschichte....

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:

Guten Tag! Verzeihen Sie die Trivialität. Die Zeilen stammen von einem Roboter, den ich schon seit Jahren habe, und im Grunde wandert ein solcher Zyklus immer von einem zum anderen.

Warum ist der Gesamtbetrag meiner Bestellung minus eins? Stimmt es, dass die Schleife eine Verringerung der Variablen und anstrebt?

Die Schleife zählt einen Index von 0 bis Total-1 oder von Total-1 bis 0. Deshalb braucht sie ein Minuszeichen oder ein kleineres Zeichen < .
 
Zhunko:

Ich würde es tun:

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);
 }

Der Empfang von Daten überMarketInfo() wäre selbst für dieses Fenster-Tool zu ressourcenintensiv, meinen Sie nicht?

Zhunko:

Sie sollten eine separate Funktion schreiben, um die Historie zu aktualisieren.


Ich verstehe nicht ganz die Logik, eine separate Funktion zu schreiben. Die Funktion RefreshRates() selbst aktualisiert die Daten der vordefinierten Variablen. Und Bid und Ask sind vordefinierte Variablen. Wenn die Funktion RefreshRates() vordefinierte Variablen aktualisiert, warum dann eine zusätzliche Funktion schreiben?
 
Ich danke Ihnen!!!