Mein Ansatz. Der Kern ist der Motor. - Seite 129

 
Ich werde meine fünf Cent dazugeben. Ich habe im Moment keine Zeit dafür. Aber es gibt eine solche Idee, ein ähnliches Panel zu Hause zu installieren. Also ich denke, nicht nur ein Kreuz zu machen, um eine Position zu schließen (obwohl es notwendig ist), sondern auch eine Marke zu machen, geben Sie die Menge und tun es Großhandel schließen. Dies ermöglicht eine flexiblere Arbeit mit den Stellen sowie deren teilweise Schließung.
 
Vasiliy Sokolov:

Arbeiten Sie mit der Version des Motors, die Sie zu Demonstrationszwecken beigefügt haben.

Es ist ziemlich einfach. Wenn Ihr Ansatz so funktioniert, wie ich denke, dann sehe ich keine Probleme mit einer dynamischen Tabelle oder der Aktualisierung von Positionswerten über einen Timer. Peter, warum hast du von Anfang an ein Chaos angerichtet?)

Vasiliy, das Wichtigste ist, keine voreiligen Schlüsse zu ziehen. Weder für Sie noch für mich)).

 
Konstantin Nikitin:
Ich werde meine fünf Cent dazugeben. Ich habe im Moment keine Zeit dafür. Aber es gibt eine solche Idee, ein ähnliches Panel zu Hause zu installieren. Also ich denke, nicht nur ein Kreuz zu tun, um die Position zu schließen (obwohl es notwendig ist), sondern auch eine Marke, geben Sie die Menge und tun dies Großhandel schließen. Dies ermöglicht eine flexiblere Arbeit mit den Stellen sowie deren teilweise Schließung.

Das kann ich tun.

 
Vasiliy Sokolov:

Peter, machen Sie eine for-Schleife im Timer, die durch die offenen Aufträge geht und Änderungen in der Auftragsliste an Ihre Tabelle sendet. Lassen Sie auch den Auftragsgewinn in Ihrer Tabelle dynamisch ändern.

Vasily, fügen Sie bitte diesen Code in die Test-EA-Datei ein (die Tick- und Timer-Funktionen anstelle der alten)

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //---------------------------------------------
   //Количество ордеров не менялось.
   //---------------------------------------------      
   if(ArraySize(Orders) == OrdersTotal())
     {
      for(int a1 = 0; a1 < OrdersTotal(); a1++)
        {
         if(OrderSelect(a1,SELECT_BY_POS))
           {
            E_Main_form_1__PnL(OrderTicket(),OrderProfit()); 
           }
        }
     }        
  }
//--------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  { 
   //---------------------------------------------
   //Ордер открылся.
   //---------------------------------------------     
   if(ArraySize(Orders) < OrdersTotal())
     {Alert("Ордер открылся!");
      ArrayResize(Orders,OrdersTotal());
      
      //---------------------------------------
      if(OrderSelect(OrdersTotal() - 1,SELECT_BY_POS))
        {
         if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES))
           {
            //----------------------------------------------------
            E_Main_form_1__Order(OrderTicket(),OrderTicket());
            E_Main_form_1__Opening_Time(OrderTicket(),TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));
            E_Main_form_1__Volume(OrderTicket(),OrderLots());
            E_Main_form_1__Symbol(OrderTicket(), OrderSymbol());
            E_Main_form_1__Price(OrderTicket(), OrderOpenPrice());
            E_Main_form_1__Comission(OrderTicket(), OrderCommission());
            E_Main_form_1__Swap(OrderTicket(), OrderSwap());
            E_Main_form_1__PnL(OrderTicket(), OrderProfit());
            E_Main_form_1__Type(OrderTicket(),OrderType()); 
            //----------------------------------------------------
           }
          //--------------------------------------  
          ArrayResize(Orders,OrdersTotal());
          Orders[OrdersTotal() - 1] = OrderTicket();   
          //--------------------------------------
        }
      //---------------------------------------  
     }
   //---------------------------------------------
   //Ордер закрылся.
   //---------------------------------------------  
   if(ArraySize(Orders) > OrdersTotal())
     {
      for(int a1 = 0; a1 < 100; a1++)
        {
         if(OrderSelect(Orders[a1],SELECT_BY_TICKET) && OrderCloseTime())
           {Alert("Ордер закрылся!");
            //--------------------------------------------------
            for(int a3 = 0; a3 < 100; a3++)
              { 
               if(Orders[a3] == OrderTicket())
                 {
                  E_Main_form_1_CLOSE_ROW___Orders_table(OrderTicket());
                  Orders[a3] = 0;
                  //--------------------------------------------------
                  int deleted = 0,q = 0;
                  //--------------------
                  for(int a2 = 0; a2 < ArraySize(Orders); a2++)
                    {
                     if(deleted)Orders[q] = Orders[q+deleted];
                     if(!Orders[q]){deleted++; q--;}
                     q++;
                    }
                  //--------------------------------------------------  
                  ArrayResize(Orders,q);
                  //--------------------------------------------------                      
                 } 
              } 
          }
      }         
 }

}
      
//---------------------------------------------

Außerdem müssen Sie die Zeilen 68 und 114 in der Datei External Connection ersetzen.

E_Main_form_1__Opening_Time(ticket,TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));
E_Main_form_1__Opening_Time(ticket,TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));

Das ist ein bisschen durcheinander. Anstelle vonOrderOpenTime() setzen SieOrderOpenPrice().


Das sollte gut funktionieren. Prüfen Sie es.

 
Beachten Sie, dass ich den Code oben leicht verändert habe (falls Sie ihn bereits eingegeben haben).
 

Eh, nicht die kanonische Sache zu tun - trennen Sie Daten (Modell) von Ansichten und verwenden Sie die Beobachter-Muster, um bestimmte Ansichten zu Modelländerungen oder bestimmte Modellfelder zu abonnieren.

Das würde jedoch voraussetzen, dass der Benutzer einer solchen Bibliothek objektorientiert denkt und seine EA-Daten in die vorgeschlagene Objektstruktur einfügt (ja, ja, man muss die Methoden dieser Bibliothek/des Frameworks lernen, um eine Schnittstelle zu erstellen). Und viele Leute haben keine Ahnung von OOP.

Aber Petrus sagt, dass ihr nichts lernen müsst! Fügen Sie einfach Ihre globalen Variablen in die vorgefertigten Handler ein, und die Schnittstelle wird funktionieren. Ja, es ist ein Geschenk des Himmels, denn es heißt nicht: "Baue Bretter für ein Regal, verbinde sie gemäß der Anleitung und ordne die Bücher an", sondern: "Zeichne dein Regal und ordne deine Bücher darauf an". Code Less Do More ((c)/JQuery, wenn Sie es sind)


Offensichtlich gibt es ein Problem mit der Produktpositionierung. Und was wäre, wenn es so wäre? Hey, Programmierer! Möchten Sie etwas Geld verdienen? Sie dürfen verkaufen, was gut aussieht! Nehmen Sie etwa hundert Expert Advisors ohne Schnittstelle und verkaufen Sie sie mit Schnittstelle. hahaha ))


Nun, es gibt einen Nachteil der Schnittstellendatei, in der die Handler der Steuerelemente "herausstechen" - sie ist statisch. Ich muss mir den Kopf zerbrechen und einen neuen Handler-Typ erstellen, der als Vorlage dient und Benutzer-/Programmdaten über Eingabeparameter akzeptiert.

 
Igor Volodin:

Eh, nicht um den Kanon zu machen...

Es ist OK, Rehtag wird Konowam machen. )))

 
Igor Volodin:

Eh, nicht die kanonische Sache zu tun - trennen Sie Daten (Modell) von Ansichten und verwenden Sie die Beobachter-Muster, um bestimmte Ansichten zu Modelländerungen oder bestimmte Modellfelder zu abonnieren.

Dies würde jedoch voraussetzen, dass der Benutzer einer solchen Bibliothek objektorientiert denkt und seine EA-Daten in die vorgeschlagene Objektstruktur einfügt (ja, ja, man muss die Methoden dieser Bibliothek/des Frameworks lernen, um die Schnittstelle zu erstellen). Und viele Leute haben keine Ahnung von OOP.

Aber Petrus sagt, dass ihr nichts lernen müsst! Fügen Sie einfach Ihre globalen Variablen in die vorgefertigten Handler ein, und die Schnittstelle wird funktionieren. Ja, es ist ein Geschenk des Himmels, denn es heißt nicht: "Baue Bretter für ein Regal, verbinde sie gemäß der Anleitung und ordne die Bücher an", sondern: "Zeichne dein Regal und ordne deine Bücher darauf an". Code Less Do More ((c)/JQuery, wenn Sie es sind)


Offensichtlich gibt es Probleme mit der Produktpositionierung. Und was wäre, wenn es so wäre? Hey, Programmierer! Möchten Sie etwas Geld verdienen? Sie dürfen verkaufen, was gut aussieht! Nehmen Sie etwa hundert Expert Advisors ohne Schnittstelle und verkaufen Sie sie mit Schnittstelle. hahaha ))


Nun, es gibt einen Nachteil der Schnittstellendatei, in der die Handler der Steuerelemente "herausragen" - sie ist statisch. Ich muss mir den Kopf zerbrechen und einen neuen Handler-Typ erstellen, der als Vorlage dient und Benutzer-/Programmdaten über Eingabeparameter akzeptiert.

Zuerst dachte ich, dass es sich um eine weitere Ladung Negativität handelt, aber dann habe ich es besser gelesen und es stellte sich heraus, dass es nicht so ist. Nur Gefühle.

Dieser Konstruktor ist für Leute gedacht, die sich wirklich für den algorithmischen Handel interessieren. Für sie ist es sinnvoll, ihre Zeit nicht mit dem Studium von Graphbibliotheken zu verschwenden, sondern einfach einen solchen Code zu erstellen:

//====================================================================================================================
NEW_WINDOW,  W_NAME, "Main form 1",  W_ICON, 12,  W_TYPE, SETTINGS, ALWAYS_ON_TOP,    OOI,
//----------------------------------------------------------------------------------
//----------------------------------------------------------------------------------
GROUP, A,

__, BUTTON,"BUY",text,N_COLOR,(int)clrBlue, GAP,50,  BUTTON,"SELL", text,N_COLOR,(int)clrRed,

END_GROUP,
//-------------------------- 
i, AT, _X2X, "MF", 10, _Y2Y,"MF", 10,

i,BUTTONS, PARAM_TYPE,_BOOL, TEXT_FONT,"Times New Roman",  W,100, H,34, FONT_SIZE,11,   END,

//----------------------------------------------------------------------------------
GROUP, A,

__,V_BOX,"V1",W,860,  _,H,248,_,N_FRAME,1,_,NP_FRAME,1,

END_GROUP,
//--------------------------
i, AT, _X2X, "MF", 10, _Y2Y,"MF", 50,
//----------------------------------------------------------------------------------

//----------------------------------------------------------------------------------
//Объявляем таблицу:
//----------------------------------------------------------------------------------
GROUP,"Orders table", IS_TABLE,  

__,     T_HEADER, "#",W,20,_,H,30, C_HEADER, "Order",     C_HEADER, "Opening Time",W,90, C_HEADER, "Type", W,90,  C_HEADER, "Volume", W,90,  C_HEADER, "Symbol", W,90, 
                               C_HEADER, "Price",       W,90,    
                               C_HEADER, "Comission",   W,90, C_HEADER, "Swap", W,90,  C_HEADER, "PnL",    W,90,  C_HEADER, "Close",  W,40,

__,     R_HEADER,"1", CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A,     
__,     R_HEADER,"2",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"3",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"4",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"5",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"6",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"7",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"8",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"9",CELL, A,   CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"10",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"11",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"12",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"13",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"14",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"15",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"16",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"17",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"18",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"19",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"20",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
__,     R_HEADER,"21",CELL, A,  CELL, A,  CELL, A,   CELL, A,  CELL, A,   CELL, A, CELL, A, CELL, A, CELL, A,  I_BUTTON, A, 
 
END_GROUP,
//------------------------------------
i,AT, LEFT_TOP, 0,0,
i, IN, "V1",
//-----------
i, Y_GAP,-1,
i, X_GAP,-1,
//-----------
i, IS_ZEBRA_STYLE,
i, DnD_RECIEVER,
i, R_HEADERS,   W,20, N_COLOR,(int)C'0,235,0', END,
i, C_HEADERS,   H,30,                          END,
i, CELLS,       H,25,                          END,
i, C_HEADERS,   DnD_ON, DnD_FUNCTION, ROTATE_COLOMNS, END,
i, I_BUTTONS, C_FUNCTION, DELETES_ROW,   text,HIDE,1, N_FRAME,1,A_FRAME,1, NP_FRAME,1, AP_FRAME,1, N_LABEL,745, END,
i, IS_DINAMIC,
//----------------------------------------------------------------------------------
"Order", H,30,
//----------------------------------------------------------------------------------
END_WINDOW,
//====================================================================================================================

Und besorgen Sie sich ein Fenster mit einem Esstisch.


In der Schnittstellendatei wird der Benutzer diesen Code erhalten:

//=====================================================================================================================
//WINDOW:   Main form 1 | element: BUTTON  | name: BUY  |  Location: Window's Main Frame
//=====================================================================================================================
case BUTTON3____BUY:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:   Main form 1 | element: BUTTON  | name: SELL  |  Location: Window's Main Frame
//=====================================================================================================================
case BUTTON4____SELL:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:   Main form 1 | element: I_BUTTON  | name: 1_Close  |  Location: Window's Main Frame   | Table: 300000007
//=====================================================================================================================
case I_BUTTON14___Close:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:     break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
   }
}
//=================================================================================================================

Und es wird bestimmen, was zu tun ist und wie es zu tun ist, wenn eine Schaltfläche angeklickt wird.

 

Die nächste dynamische Tabelle wird noch interessanter sein. Die Zellen enthalten Eingabefelder, Popup-Listen, Kontrollkästchen, Schaltflächen, Optionsschaltflächen, Fortschrittsbalken und Eingabefelder mit Schaltflächen für +/-.

Der schwierige Teil ist die Dynamik einer solchen Tabelle. Schließlich ist der Zugriff auf die Elemente und die Abfrage ihrer Werte nicht an bestimmte Parameter gebunden, sondern hängt vom Zeilenlayout ab.