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

 
Hallo Fachleute, bitte um Rat! Wie sollte ich in den EA schreiben, so dass, wenn eine Wette ist aus, der EA nimmt eine neue Wette in die entgegengesetzte Richtung auf dem gleichen bar (wie ein "flip"). Ich teste mit dem Modell "wenn eine neue Leiste geöffnet wird". Für das Beispiel EA:
//+------------------------------------------------------------------+
//|                                                      CrossMa.mq4 |
//|                      Copyright © 2005, George-on-Don             |
//|                                       http://www.forex.aaanet.ru |
//+------------------------------------------------------------------+
#include <stdlib.mqh>
#include <stderror.mqh>
 
#define MAGICMA  20050610
 
extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
extern double MovingPeriod       = 12;
extern double MovingShift        = 0;
extern double MovingPeriod1      = 4;
extern double AtrPer             = 6;
extern bool   SndMl              = True ;
//+------------------------------------------------------------------+
//| Расчет открытия позиции                                          |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Расчет оптимальной величины лота                                 |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//---- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Проверка для открытия позиции с первым тиком нового бара.        |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;
   double Atr;
   int    res;
   string sHeaderLetter;
   string sBodyLetter;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average 
   mas=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1); // динный мувинг 12
   maf=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,1);// короткий мувинг 4
   mas_p=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2); // динный мувинг 12
   maf_p=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,2);// короткий мувинг 4
   Atr = iATR(NULL,0,AtrPer,0);
 //---- Условие продажи
   if(maf<mas && maf_p>=mas_p)  
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
       if (SndMl == True && res != -1) 
         {
         sHeaderLetter = "Operation SELL by" + Symbol()+"";
         sBodyLetter = "Order Sell by"+ Symbol() + " at " + DoubleToStr(Bid,4)+ ", and set stop/loss at " + DoubleToStr(Ask+Atr,4)+"";
         sndMessage(sHeaderLetter, sBodyLetter);
         }
      return;
     }
//---- Условие покупки
   if(maf>mas && maf_p<=mas_p)  
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      if ( SndMl == True && res != -1)
      { 
      sHeaderLetter = "Operation BUY at" + Symbol()+"";
      sBodyLetter = "Order Buy at"+ Symbol() + " for " + DoubleToStr(Ask,4)+ ", and set stop/loss at " + DoubleToStr(Bid-Atr,4)+"";
      sndMessage(sHeaderLetter, sBodyLetter);
      }
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| ПРоверка для закрытия открытой позиции                           |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;
   string sHeaderLetter;
   string sBodyLetter;
   bool rtvl;
//---- 
   if(Volume[0]>1) return;
//----  
   mas=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1); // динный мувинг 12
   maf=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,1);// короткий мувинг 4
   mas_p=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2); // динный мувинг 12
   maf_p=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,2);// короткий мувинг 4
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //----  
      if(OrderType()==OP_BUY)
        {
         if(maf<mas && maf_p>=mas_p) rtvl=OrderClose(OrderTicket(),OrderLots(),Bid,3,Lime);
            if ( SndMl == True && rtvl != False )
            {
            sHeaderLetter = "Operation CLOSE BUY at" + Symbol()+"";
            sBodyLetter = "Close order Buy at"+ Symbol() + " for " + DoubleToStr(Bid,4)+ ", and finish this Trade";
            sndMessage(sHeaderLetter, sBodyLetter);
            }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(maf>mas && maf_p<=mas_p) rtvl=OrderClose(OrderTicket(),OrderLots(),Ask,3,Lime);
         if ( SndMl == True && rtvl != False ) 
         {
         sHeaderLetter = "Operation CLOSE SELL at" + Symbol()+"";
         sBodyLetter = "Close order Sell at"+ Symbol() + " for " + DoubleToStr(Ask,4)+ ", and finish this Trade";
         sndMessage(sHeaderLetter, sBodyLetter);
         }
         break;
        }
     }
//----
  }
  
//--------------------------------------------------------------------
// функция отправки ссобщения об отрытии или закрытии позиции
//--------------------------------------------------------------------
void sndMessage(string HeaderLetter, string BodyLetter)
{
   int RetVal;
   SendMail( HeaderLetter, BodyLetter );
   RetVal = GetLastError();
   if (RetVal!= ERR_NO_MQLERROR) Print ("Ошибка, сообщение не отправлено: ", ErrorDescription(RetVal));
}
//+------------------------------------------------------------------+
//| Майн функция                                                     |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<25 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+
Ich danke Ihnen!
 

Guten Tag. Frage zur Standardfunktion SendMail... Umzu verstehen, wie die Funktion funktioniert, habe ich dieses Skript geschrieben:

//+------------------------------------------------------------------+
//|                                             функция_SendMail.mq4 |
//|                      Copyright © 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//+------------------------------------------------------------------+

SendMail("Скрипт Функция_SendMail","Webmoney - идите в жопу!!!!");
Alert(GetLastError());
   
//+------------------------------------------------------------------+   
   return(0);
  }
//+------------------------------------------------------------------+

Bei der Ausführung im Client-Terminalfenster wird ein Fehler im Protokoll angezeigt:

In den Einstellungen (Client-Terminal-Menü Extras -> Einstellungen -> Registerkarte Mail) werden die folgenden Parameter festgelegt:

Anstelle der drei Punkte in den Feldern SMTP-Login und Von wem steht der Name des Postfachs, von dem ich die Nachricht senden möchte, und im Feld An - der Name des Postfachs, an das ich die Nachricht senden möchte.

Gleichzeitigist dieimFeldSMTP-Server angegebene Portnummertatsächlich 25:

Hinweis: Der Screenshot wurde im Hilfebereich von Mail erstellt.Ru.

Frage: Was ist dieser Fehler und wie kann er behoben werden? Der Compiler zeigt keine Fehler an und die Funktion GetLastError() gibt 0 zurück.

P.S. Um das Forum nicht zu überfrachten, danke ich Ihnen im Voraus für Ihre Antwort.

 
7777877:

Guten Tag. Frage zur Standardfunktion SendMail... Umzu verstehen, wie die Funktion funktioniert, habe ich dieses Skript geschrieben:

Bei der Ausführung im Client-Terminalfenster wird ein Fehler im Protokoll angezeigt:

In den Einstellungen (Client-Terminal-Menü Extras -> Einstellungen -> Registerkarte Mail) werden die folgenden Parameter festgelegt:

Anstelle der drei Punkte in den Feldern SMTP-Login und Von wem steht der Name des Postfachs, von dem ich die Nachricht senden möchte, und im Feld An - der Name des Postfachs, an das ich die Nachricht senden möchte.

Gleichzeitigist dieimFeldSMTP-Server angegebene Portnummertatsächlich 25:

Hinweis: Der Screenshot wurde im Hilfebereich von Mail erstellt.Ru.

Frage: Was ist dieser Fehler und wie kann er behoben werden? Der Compiler zeigt keine Fehler an und die Funktion GetLastError() gibt 0 zurück.

P.S. Um das Forum nicht zu überfrachten, danke ich Ihnen im Voraus für Ihre Antwort.

Sehen Sie sich den Anschluss und die Verschlüsselung an. Vielleicht sollten Sie sie auf 2525 einstellen.
 

Bitte um Hilfe.

Hier ist der Code


//-----------------Закрытие по истории в безубыток--------------------
   //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0,
Time_at_History_Previos = 0;     
 
 if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0)
                  break;
               }
            }
         }
      }
   }

if (Sum_Loss < 0.0) { // Имеем убыток по закрытым позам
double money = Lots;
   BuyLots = GetBuyLotsSum();
        SellLots = GetSellLotsSum();
        if(BuyLots  > SellLots)money = BuyLots * 10;
        if(BuyLots  < SellLots)money = SellLots * 10;
  if (((AccountEquity() + Sum_Loss + (Sum_Loss / money)) >= AccountBalance()) && (((totalSell > 0) && (totalBuy < 1)) || ((totalSell < 1) && (totalBuy > 0)))) { // Достигли безубытка
    // Здесь какой-то код, который необходимо выполнить при достижении безубытка
        CloseAllBuy();
           CloseAllSell();
           Sum_Loss = 0.0;
           

Ich habe keine Möglichkeit, eine Schleife zu öffnen, wenn ein Geschäft im Minus abgeschlossen wurde, und wenn der nächste Auftrag über Null abgeschlossen wurde, d. h. positiver Saldo, aber weniger als negativ, addieren wir Plus zu Negativ und erhalten einen neuen negativen Wert, der bereits weniger ist.

if(OrderProfit() >= 0 && Sum_Loss < 0.0)
                  double lastLoss_two = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss_two;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
               }

Wenn das Signal negativer ausfällt, schließen wir den Auftrag und beginnen den Zyklus von vorne.


Die Situation ist, dass, wenn dieser Code schließt das Geschäft in Verlust, dann merkt es sich die Minus-Balance, und wenn es schließt das Geschäft in der plus, und das Plus ist weniger als die Balance, dann ist es zurückgesetzt Sum_Loss und ich brauche, dass es nicht auf Null gesetzt, und gemäht.

Und so funktioniert es jetzt:

er prüft eine geschlossene Order, wenn der Gewinn der geschlossenen Order kleiner als Null ist, dann wird dieser Gewinn zu Sum_Loss addiert, und so weiter, bis der Gewinn des offenen Handels Sum_Loss übersteigt (mehr als), wenn er erreicht ist, wird der Handel geschlossen, und Sum_Loss wird auf Null gesetzt und der Zyklus beginnt erneut.

Ich brauche:

Wurde ein Auftrag mit einem Minus abgeschlossen, wurde der Minusgewinn zu Sum_Loss addiert. Wurde der nächste Auftrag mit einem positiven Gewinn abgeschlossen, wird Sum_Loss um den Betrag des Gewinns reduziert, was bedeutet, dass der nächste offene Auftrag Sum_Loss einen geringeren Betrag erhält, und so weiter, bis der Gewinn aus dem Auftrag größer ist als Sum_Loss, und dann wird Sum_Loss auf Null gesetzt und ein neuer Zyklus beginnt.

Summe_Verlust = 0;

1. geschlossener Auftrag: Gewinn (-50) < 0

Summe_Verlust + Gewinn (Summe_Verlust + (-50))

Summe_Verlust = -50;

2. geschlossener Auftrag: Gewinn (+40) > 0 und Summe/Verlust < 0

Summe_Verlust + Gewinn (Summe_Verlust + 40)

Summe_Verlust = -10
 
7777877:

Guten Tag. Frage zur Standardfunktion SendMail... Umzu verstehen, wie die Funktion funktioniert, habe ich dieses Skript geschrieben:

Bei der Ausführung im Client-Terminalfenster wird ein Fehler im Protokoll angezeigt:

In den Einstellungen (Client-Terminal-Menü Extras -> Einstellungen -> Registerkarte Mail) werden die folgenden Parameter festgelegt:

Anstelle der drei Punkte in den Feldern SMTP-Login und Von wem steht der Name des Postfachs, von dem ich die Nachricht senden möchte, und im Feld An - der Name des Postfachs, an das ich die Nachricht senden möchte.

Gleichzeitigist dieimFeldSMTP-Server angegebene Portnummertatsächlich 25:

Hinweis: Der Screenshot wurde im Hilfebereich von Mail erstellt.Ru.

Frage: Was ist dieser Fehler und wie kann er behoben werden? Der Compiler zeigt keine Fehler an und die Funktion GetLastError() gibt 0 zurück.

P.S. Um das Forum nicht zu überfrachten, danke ich Ihnen im Voraus für Ihre Antwort.

Hilfe

der Server smtp.mail.ru:25 funktioniert wirklich

 
YOUNGA:

Hilfe

Der Server smtp.mail.ru:25 funktioniert wirklich.

Mein Test-Login, von wem, an wen, passt.

Vielleicht sind die Firewalls im Weg?

Oh, Mann, das sind eine Million Tipps - setzen Sie das Terminal zurück!


 

Menschen helfen

Ich erteile einen schwebenden Auftrag zum Preis x. Die Order wird in eine Marktorder zum Preis Y umgewandelt. Kann ich irgendwo herausfinden, zu welchem Preis die schwebende Order platziert wurde (im Journal ...oder ) oder muss ich mein eigenes Array schreiben

 

Guten Abend!

Bitte geben Sie mir einen Hinweis auf die mögliche Fehlerursache. Ich lerne die Sprache gerade erst, deshalb bin ich ein wenig ratlos.

Die Aufgabe im Expert Advisor Code ist es, Daten aus der .scv Datei zu lesen (zwei Werte in einer Zeile, 400 Zeilen) und sie in ein Array zu schreiben.

double signals_array[400][2];

int init()
  {

   int Handle;
      Handle=FileOpen("Signals.csv",FILE_CSV|FILE_READ,";");// Открытие файла
   if(Handle<0)                        // Неудача при открытии файла
      {
      if(GetLastError()==4103)         // Если файла не существует,..
         Alert("Нет файла");//.. извещаем трейдера 
      else                             // При любой другой ошибке..
         Alert("Ошибка при открытии файла");//..такое сообщ
         PlaySound("Bzrrr.wav");          // Звуковое сопровождение
         return;                          // Выход из start()      
      }

   for (int i = 0; i < 400; i++)
      {
      for (int j = 0; j < 2; j++)
         signals_array[i][j] = StrToDouble(FileReadString(Handle));
      }

Alert (signals_array[120][0],"; ",signals_array[0][1]," OK!");
//----
   return(0);
  }

Das Problem ist folgendes: wenn ich den EA auf einem Diagramm werfen, druckt es eine Warnung mit den richtigen Werten aus dem Array, aber wenn ich versuche, den EA zu testen, druckt es eine Warnung "Keine Datei" im Protokoll. Das heißt, es scheint nicht auf die Datei zugreifen zu können (obwohl es unglaublich ist) und schreibt Werte in das Array (was durch eine andere Meldung bestätigt wird), bleibt aber laut Protokoll beim Auffinden der Datei stecken. Verwirrt. Unten sehen Sie einen Screenshot.

 

alexeymosc:

Das Problem ist folgendes: Wenn ich den Expert Advisor auf den Chart werfe, gibt er eine Meldung mit den richtigen Werten aus dem Array aus, aber wenn ich versuche, den Expert Advisor zu testen, gibt er die Meldung "No file" im Protokoll aus. D.h. es scheint, dass er nicht auf die Datei zugreifen kann (obwohl es unglaublich ist) und Werte in ein Array schreibt (dies wird durch eine andere Meldung bestätigt), aber beim Auffinden einer Datei im Protokoll einfriert. Verwirrt.


Im Prüfgerät und auf der Karte werden die Dateien in verschiedenen Verzeichnissen geschrieben und gelesen:

  1. MetaTrader 4\tester\experts\dateien
  2. MetaTrader 4\experts\files
 
alexeymosc:

Guten Abend!

Bitte geben Sie mir einen Hinweis auf die mögliche Fehlerursache. Ich lerne die Sprache gerade erst, deshalb bin ich ein wenig ratlos.

Die Aufgabe im Expert Advisor Code ist es, Daten aus der .scv Datei zu lesen (zwei Werte in einer Zeile, 400 Zeilen) und sie in ein Array zu schreiben.

Das Problem ist folgendes: wenn ich den EA auf einem Diagramm werfen, druckt es eine Warnung mit den richtigen Werten aus dem Array, aber wenn ich versuche, den EA zu testen, druckt es eine Warnung "Keine Datei" im Protokoll. Das heißt, es scheint nicht auf die Datei zugreifen zu können (obwohl es unglaublich ist) und schreibt Werte in das Array (was durch eine andere Meldung bestätigt wird), bleibt aber laut Protokoll beim Auffinden der Datei stecken. Verwirrt. Unten sehen Sie einen Screenshot.

Wenn eine Datei geöffnet ist, sollte sie geschlossen werden, auch wenn ein Fehler bei der Arbeit mit ihr auftritt. Bis jetzt sehe ich keine weiteren Fehler.

Sie kann folgendermaßen gelesen werden:

signals_array[i][j] = FileReadDouble(Handle);
Grund der Beschwerde: