Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 486

 
evillive:

Wenn du deine Zahl 108 nimmst, erhältst du höchstens 151 hoch 151 - 108^151=1,11426138071861e+307

108^152=1,20340229117609e+309 ist zu viel für die MCL-Programmierung, ganz zu schweigen von 108^4096

Für welche Art von Berechnungen wird eine solche Skala benötigt?


Ich versuche, die Analyse von Preisbewegungen und das nlp-Aufmerksamkeitsmanagement sowie das Gehirn auf Autopilot zu synthetisieren :)
 
alex12:
Ich versuche, die Analyse der Preisentwicklung und das nlp-Aufmerksamkeitsmanagement zu verbinden, und mein Gehirn ist auf Autopilot :)
Auf der Suche nach Erleuchtung kommt es darauf an, die richtigen Mittel zu wählen, um nicht zu weit zu fliegen
 

Ich habe begonnen, MQL4 zu lernen und kann nicht verstehen, wie ein Auftrag ausgewählt wird

aus dem Lernprogramm:

for(int i=1; i<=OrdersTotal(); i++) // Die Bestellschleife

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // Wenn

{

wenn (OrderSymbol()!= Symbol) weiter;

Mein Verständnis ist: For i=1, solange i<= Anzahl der Aufträge

Wenn der ausgewählte Auftrag an Position i-1 (d.h. Auftrag #0) existiert

Vergleiche es mit dem Symbol

Dann addiere 1(i++) zu i und beginne eine neue Iteration

Ich verstehe den Kommentar // Wenn es einen nächsten Auftrag gibt (was meinen Sie: nächster nach Position oder dieser Auftrag, der gerade ausgewählt wird?)

Bitte erklären Sie das auf Russisch.

 
Wenn es einen Auftrag gibt, d.h. unter der Nummer und-1 existiert, dann gehe zur nächsten Bedingung.
 
Vladon:
Wenn es einen Auftrag gibt, d.h. unter der Nummer und-1 existiert, dann gehe zur nächsten Bedingung.

Es wird immer eine Bestellung mit der Nummer Null (also i-1) gefunden. Was für eine verrückte Methode zur Bestimmung der "nächsten" Bestellung, wirklich irreführend...
 
Ich danke Ihnen für die Erläuterungen.
 
evillive:

Es wird immer eine Reihenfolge mit der Nummer Null (also i-1) gefunden. Das ist eine wilde Methode zur Bestimmung der "nächsten" Bestellung, die wirklich irreführend ist...


Wenn es keine Aufträge gibt, dann mit diesem Entwurf:

for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

{ 

if (OrderSymbol()!= Symb) continue;

wird nicht zur nächsten Bedingung übergegangen.

weil es keine Ordnung und-1 (in unserem Fall =0) gibt

Natürlich ist es nicht bequem, es so zu schreiben, und es ist nicht klar, warum es so sein sollte,

und nicht zum Beispiel auf diese Weise:

for(int i=0; i<OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий

{ 

if (OrderSymbol()!= Symb) continue;
 

Hallo Herr Programmierer, ich habe eine Frage, ich kann nicht lernen, einen Teil des Codes, um den Prozentsatz des Kontostandes zu schließen. es schließt nicht den Prozentsatz, sondern alle auf einmal und alle Aufträge, die auf dem Markt sind. Ich brauche, dass ein bestimmter Auftrag und der berechnete Prozentsatz des Gleichgewichts der deposit.advise schließen würde, was ich falsch mache?


extern double Percent = 2.0;
extern int Slippage = 2;
double stop;

void OnStart()
{

if (Digits == 3 || Digits == 5)
{
Slippage *= 10;
}

for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol())
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(stop==Kontostand()/100*Perzent)
stop=Kontostand()/100*Perzent;
if(stop<=Kontostand())
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);
}//if(ostop<=AccountBalance())
}////(ostop==Kontostand()/100*Prozent)
}//// (OrderSymbol() == Symbol() )
}// (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//// for(int i = OrdersTotal()-1; i>=0; i--)
return;
}////void OnStart()
//+-----------------------------------------------------------------

 
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);

Wie kommt das?

und dies:

if(stop==AccountBalance()/100*Percent)
stop=AccountBalance()/100*Percent;

wird niemals erfüllt werden.

daher:

if(stop<=AccountBalance())

wird immer mit jeder Bestellung funktionieren.

SCHLUSSFOLGERUNG: Alles ist falsch.

Ihre Funktion muss durchdacht werden, eine schnelle Antwort habe ich nicht.

Aber wenigstens ist es so, dass es am Anfang so ist:

extern double Percent = 2.0;
extern int Slippage = 2;
double stop;

void OnStart()
{

if (Digits == 3 || Digits == 5)
{
Slippage *= 10;
}

for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol()) 
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(OrderProfit()>=AccountBalance()/100*Percent)

{
if(OrderType() == OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
if(OrderType() == OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);
}//if(ostop<=AccountBalance())
}//if(ostop==AccountBalance()/100*Percent)
}//if (OrderSymbol() == Symbol() )
}//if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//for(int i = OrdersTotal()-1; i>=0; i--)
return;
}//void OnStart()
//+-----------------------------------------------------------------
 
Vladon:


Wenn es keine Aufträge in einer solchen Konstruktion gibt:

wird nicht zur nächsten Bedingung übergegangen.

weil es keine Ordnung und-1 (in unserem Fall =0) gibt

Natürlich ist es nicht bequem, es so zu schreiben, und es ist nicht klar, warum es so sein sollte,

und nicht, zum Beispiel, so:


Als ich es las, dachte ich auch, warum nicht einfach i=0, das scheint einfacher und klarer zu sein.

Hier ist der gesamte Skriptcode, vielleicht gibt es einen guten Grund, warum der Autor i=1 anstelle von i=0 gesetzt hat. Ich weiß nur nicht genug darüber und sehe es vielleicht einfach nicht, während ich den Funktionsmechanismus verstehen muss, um später keine Fragen zu stellen

// closeorder.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
int start()                                     // Спец.функция start
  {
   string Symb=Symbol();                        // Финанс. инструмент
   double Dist=1000000.0;                       // Предустановка
   int Real_Order=-1;                           // Пока рыночных нет
   double Win_Price=WindowPriceOnDropped();     // Здесь брошен скрипт
//--------------------------------------------------------------- 2 --
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         //------------------------------------------------------ 3 --
         if (OrderSymbol()!= Symb) continue;    // Не наш фин.инструм.
         int Tip=OrderType();                   // Тип ордера
         if (Tip>1) continue;                   // Отложенный ордер  
         //------------------------------------------------------ 4 --
         double Price=OrderOpenPrice();         // Цена ордера
         if (NormalizeDouble(MathAbs(Price-Win_Price),Digits)< //Выбор
            NormalizeDouble(Dist,Digits))       // самого близкого орд       
           {
            Dist=MathAbs(Price-Win_Price);      // Новое значение
            Real_Order=Tip;                     // Есть рыночный ордер
            int Ticket=OrderTicket();           // Номер ордера
            double Lot=OrderLots();             // Количество лотов
           }
         //------------------------------------------------------ 5 --
        }                                       //Конец анализа ордера
     }                                          //Конец перебора орд.
//--------------------------------------------------------------- 6 --
   while(true)                                  // Цикл закрытия орд.
     {
      if (Real_Order==-1)                       // Если рыночных нет
        {
         Alert("По ",Symb," рыночных ордеров нет");
         break;                                 // Выход из цикла закр        
        }
      //--------------------------------------------------------- 7 --
      switch(Real_Order)                        // По типу ордера
        {
         case 0: double Price_Cls=Bid;          // Ордер Buy
            string Text="Buy ";                 // Текст для Buy
            break;                              // Из switch
         case 1: Price_Cls=Ask;                 // Ордер Sell
            Text="Sell ";                       // Текст для Sell
        }
      Alert("Попытка закрыть ",Text," ",Ticket,". Ожидание ответа..");
      bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрытие ордера
      //--------------------------------------------------------- 8 --
      if (Ans==true)                            // Получилось :)
        {
         Alert ("Закрыт ордер ",Text," ",Ticket);
         break;                                 // Выход из цикла закр
        }
      //--------------------------------------------------------- 9 --
      int Error=GetLastError();                 // Не получилось :(
      switch(Error)                             // Преодолимые ошибки
        {
         case 135:Alert("Цена изменилась. Пробуем ещё раз..");
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
         case 136:Alert("Нет цен. Ждём новый тик..");
            while(RefreshRates()==false)        // До нового тика
               Sleep(1);                        // Задержка в цикле
            continue;                           // На след. итерацию
         case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
            Sleep(500);                         // Простое решение
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
        }
      switch(Error)                             // Критические ошибки
        {
         case 2 : Alert("Общая ошибка.");
            break;                              // Выход из switch
         case 5 : Alert("Старая версия клиентского терминала.");
            break;                              // Выход из switch
         case 64: Alert("Счет заблокирован.");
            break;                              // Выход из switch
         case 133:Alert("Торговля запрещена");
            break;                              // Выход из switch
         default: Alert("Возникла ошибка ",Error);//Другие варианты   
        }
      break;                                    // Выход из цикла закр
     }
//-------------------------------------------------------------- 10 --
   Alert ("Скрипт закончил работу -----------------------------");
   return;                                      // Выход из start()
  }