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

 
Vasiliy Sokolov:

Scheiße, Mann, verstehst du wirklich nicht, was hier los ist, oder versuchst du auf diese Weise zu sparen?

Das Wichtigste und Komplizierteste in jedem Panel ist die Darstellung der Konsistenz. Wenn ein Auftrag offen ist, sollte er angezeigt werden, und wenn er nicht auf der Registerkarte "Handel" steht, sollte er auch nicht im Panel angezeigt werden. Dies ist elementar und konzeptionell "sehr einfach". Aber um es "sehr einfach" zu machen, muss das Gremium auf einem Zustandsmodell beruhen. Sie haben nichts dergleichen, sondern eine lokale, nicht konsistente Kurvendatenbank für Zeichenketten, die in Benutzerobjekte gestopft werden:

Und jetzt versuchen Sie, uns zu beweisen, dass es kein Problem gibt, dass alles aus der Luft gegriffen ist. dass nicht anzeigbare Aufträge in Ihrer Tabelle in Ordnung sind. Dass die Aufträge, die in Ihrer Tabelle stehen, aber eigentlich längst abgeschlossen sind - auch das ist normal. Und im Allgemeinen ist alles so normal und gut, außer dass die Anzahl der Stellen auf 20 begrenzt ist.

Sie verstehen, dass es darum geht, die Öffnung/Schließung des Auftrags mit internen Mitteln zu fixieren. Dies ist nicht Teil des Mechanismus der Tabelle selbst. Es ist ein BENUTZER-Mechanismus!

Anstatt die Engine und die Implementierung der Tabelle zu kritisieren, sollten Sie lieber einen angemessenen Mechanismus zur Behebung des Öffnens und Schließens von Aufträgen schreiben.

Und alles wird RICHTIG funktionieren!

 
Реter Konow:

  1. Dazu muss der Benutzer selbst eine Schleife über die Aufträge auf Ticks oder Timer schreiben und deren Ticks mit den im Array geschriebenen Ticks abgleichen. Wenn kein Ticket im Array vorhanden ist, bedeutet dies, dass die Bestellung gerade geöffnet wurde, und dann sollte E_Main_form_1__PnL(OrderTicket(),OrderProfit()) aufgerufen werden;

4. wenn Sie diese Bestellzyklen richtig schreiben, wird die Tabelle korrekt funktionieren....

Ich habe es einfach vergessen....

Das heißt aber nicht, dass die dynamische Tabelle selbst nicht funktioniert.

Der Benutzer muss mit der Dokumentation vertraut sein. Weiß er, was er in welches Feld einfügen muss und wie er das alles aktualisiert? Ich bat Sie, eine voll funktionsfähige Demonstration zu schreiben, die aus Ihrem Code zu verstehen, wie und was getan wird und wo und was eingefügt wird, aber Sie wischten mein TOR und gab es mir in Form einer krummen Tabelle zurück!

 
Vasiliy Sokolov:

Ich spüre einfach eine große Vernachlässigung bei dir, bei deinem Code und all den Dingen, die du sozusagen für die Menschen tust, aber wenn es dann um die Einzelheiten geht, fängt der Mist an. Tun Sie etwas, das klein, aber gut und von hoher Qualität ist. Sie sagen, dass alles einfach zu lösen ist, elementar. Aber aus irgendeinem Grund haben Sie eine Lösung gefunden, an der nichts dran ist. Was hat Sie daran gehindert, all diese einfachen Chips in vierzehn Tagen zu machen?

Entschuldigen Sie die negative Einstellung. Sie haben mich nur enttäuscht. Ich hatte gehofft, mehr und Besseres zu sehen. Bitte korrigieren Sie Ihre Demo. Machen Sie es gut, qualitativ hochwertig, entsprechend der Anfrage und ohne die Worte: "Ja, es ist elementar, es muss hier und da optimiert werden". Schlagen Sie eine Lösung vor, gegen die man protestieren könnte.

Vasiliy, werde nicht emotional. Ich bin nie respektlos behandelt worden. Ich habe einfach lange Zeit nicht mit Aufträgen gearbeitet und habe vergessen, wie man das macht. Aber es ist eine Benutzeraufgabe.

Aber ich werde es trotzdem tun. Da Sie es so schwierig finden...

 
Реter Konow:

Wassili, es gibt keinen Grund für Emotionen. Ich war in keiner Weise respektlos. Ich habe nur lange Zeit nicht mit Aufträgen gearbeitet und vergessen, wie man das macht. Aber es ist eine Benutzeraufgabe.

Aber ich werde es trotzdem tun. Wenn Sie denken, dass es so kompliziert ist...

Dann tun Sie es. Ich finde es nicht so kompliziert, aber ich wiederhole, es gibt keine Dokumentation für Ihren Motor, und ich weiß nicht, welches Feld mit welchen Parametern zu aktualisieren. Was ich brauche, ist eine Demonstration in Form einer vollständigen Lösung. Nur so kann man verstehen, was man tut und wie es funktioniert. Das ist genau das, was ich von Ihnen erwartet habe. Wenn Sie es erstellen, werden wir technische Lösungen besprechen. Und nehmen Sie Kritik von außen, auch von Experten, generell als positiv auf, denn negatives Feedback ist meist wertvoller als positives Feedback.

 

Ich werde erklären, wie eine dynamische Tabelle funktioniert:

1. Wenn die Kauf-/Verkaufsschaltflächen angeklickt werden, geht das Signal an die External Connection-Datei im Case-Block der Schaltfläche selbst.

case BUTTON3___BUY:
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:     break;
  
                case released:  
                               
                              int ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-30*Point,Ask+50*Point,NULL,16384,0,Green);  
                              //--------------------------------------------------------------------------------------- 
                              if(ticket>0)
                                {
                                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                   {
                                    Alert("BUY order opened");
                                    //----------------------------------------------------
                                    E_Main_form_1__Order(ticket,ticket);
                                    E_Main_form_1__Opening_Time(ticket,TimeToStr(OrderOpenTime(),TIME_MINUTES|TIME_SECONDS));
                                    E_Main_form_1__Type(ticket, "BUY");
                                    E_Main_form_1__Volume(ticket,OrderLots());
                                    E_Main_form_1__Symbol(ticket, OrderSymbol());
                                    E_Main_form_1__Price(ticket, OrderOpenPrice());
                                    E_Main_form_1__Comission(ticket, OrderCommission());
                                    E_Main_form_1__Swap(ticket, OrderSwap());
                                    E_Main_form_1__PnL(ticket, OrderProfit()); 
                                    //----------------------------------------------------
                                   }
                                 //--------------------------------------  
                                 ArrayResize(Orders,OrdersTotal());
                                 Orders[OrdersTotal() - 1] = ticket;   
                                 //--------------------------------------                                    
                                }
                              else Print("Error opening BUY order : ",GetLastError());
                              //---------------------------------------------------------------------------------------
                break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;

Sie müssen wissen, dass automatisch eine neue Zeile geöffnet wird, wenn ein neues Ticket an die FunktionE_Main_form_1__Price(ticket, OrderOpenPrice()); gesendet wird.

Wenn das Ticket bereits existiert, wird die gewünschte Zeile AUTOMATISCH ausgewählt und der neue Wert dort eingestellt.

Um eine Zeile in der Tabelle zu schließen , rufen Sie die Funktion E_Main_form_1_CLOSE_ROW___Orders_table(ticket) auf;

Mit dem Ticket ist das Reihenticket gemeint.

 
Реter Konow:

Ich werde erklären, wie eine dynamische Tabelle funktioniert:

1. Wenn die Kauf-/Verkaufsschaltflächen angeklickt werden, geht das Signal an die External Connection-Datei im Case-Block der Schaltfläche selbst.

Sie müssen wissen, dass automatisch eine neue Zeile geöffnet wird, wenn ein neues Ticket an die FunktionE_Main_form_1__Price(ticket, OrderOpenPrice()); gesendet wird.

Wenn das Ticket bereits existiert, wird die gewünschte Zeile AUTOMATISCH ausgewählt und der neue Wert dort eingestellt.

Um eine Zeile in der Tabelle zu schließen , rufen Sie die Funktion E_Main_form_1_CLOSE_ROW___Orders_table(ticket) auf;

Ticket bedeutet Reihenkarte.

Peter, erstellen Sie eine for-Schleife im Timer, die die offenen Aufträge durchläuft und Änderungen in der Liste der Aufträge an Ihre Tabelle sendet. Achten Sie außerdem darauf, dass sich der Gewinn der Bestellung in Ihrer Tabelle ebenfalls dynamisch ändert.

 
Реter Konow:

Ich werde erklären, wie eine dynamische Tabelle funktioniert:

1. Wenn die Kauf-/Verkaufsschaltflächen angeklickt werden, geht das Signal an die External Connection-Datei im Case-Block der Schaltfläche selbst.

Sie müssen wissen, dass automatisch eine neue Zeile geöffnet wird, wenn ein neues Ticket an die FunktionE_Main_form_1__Price(ticket, OrderOpenPrice()); gesendet wird.

Wenn das Ticket bereits existiert, wird die gewünschte Zeile AUTOMATISCH ausgewählt und der neue Wert dort eingestellt.

Um eine Zeile in der Tabelle zu schließen , rufen Sie die Funktion E_Main_form_1_CLOSE_ROW___Orders_table(ticket) auf;

Ticket bedeutet Reihenkarte.

Dies ist eine krumme Umsetzung, und hier ist die Antwort:

Forum zum Thema Handel, automatische Handelssysteme und Strategietests

Mein Ansatz. Kern - Motor.

Vasiliy Sokolov, 2019.01.09 13:33

Peter, es tut mir leid, aber Ihre Arbeit wird nicht akzeptiert, da es sich bei dem, was Sie geschickt haben, um einen seltenen Hackjob handelt. Es tut mir leid, aber ich scheine der Einzige zu sein, der das, was Sie geschickt haben, überprüft hat, und außer mir wird niemand das Gutachten erstellen.

Die Aufgabenstellung lautete also der Reihe nach wie folgt:

Was ich stattdessen sehe:

Erstens können Geschäfte in Ihrem Panel nur durch Klicken auf die Schaltfläche Kaufen/Verkaufen eröffnet werden. Wenn die Position über das Standardfenster eröffnet wird, wird der Handel nicht angezeigt.

....

Bislang ein fettes No-Go. Ich warte auf Ihre Verfeinerungen. Und keine 3D-Renderings, bis Sie es herausgefunden haben!

 

Angenommen, wir haben mehrere dynamische Tabellen.

Die Datei mit den Verbindungseigenschaften druckt automatisch Wrapper-Funktionen für die Arbeit mit diesen Tabellen.

Hier ist ein anschauliches Beispiel. Wir haben eine dynamische TabelleOrders_table gezeichnet.

Dies sind die Wrapper-Funktionen, die wir haben:

void E_Main_form_1__Order(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Opening_Time(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Type(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Volume(long Magic, string Value)
//---------------------------------------------------------------------------------------------------------
void E_Main_form_1__Symbol(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Price(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Comission(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Swap(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__PnL(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1__Close(long Magic, string Value)
//----------------------------------------------------------------------------------------------------------------
void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)
//----------------------------------------------------------------------------------------------------------------

Hinweis: Jeder Wrapper hat einen dyn.table-Spaltennamen am Ende seines Namens.

Das spezifische Element wird nicht angegeben, sondern nurdie magische Zeile.

Das heißt, um einen neuen Wert in eine Zelle einer bestehenden Zeile zu setzen, müssen Sie deren Magic und Wert senden.

Um einen neuen Wert in eine Zelle einer nicht existierenden Zeile zu setzen, müssen Sie deren Magie und Wert senden. Die Zeile wird automatisch erstellt.

Um eine Zeile in der Tabelle zu löschen, müssen Sie den Wrapper mit den WortenCLOSE_ROW aufrufen

Zum Beispiel:

void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)

Und geben Sie darin den Namen der Zeile ein, die Sie schließen möchten.

Das war's.

 
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. Achten Sie auch darauf, dass sich der Gewinn der Bestellung in Ihrer Tabelle ebenfalls dynamisch ändert.

Ok, ich werde Schleifen und Code für die Arbeit mit Aufträgen zu schreiben, aber ich werde es Ihnen geben, um es selbst zu setzen, weil ich bereits den Motor umgewandelt haben, um durch Ressourcen zu verknüpfen und bin das Testen. Im Moment kann ich den alten Link nicht wiederherstellen, und ich habe den neuen noch nicht fertiggestellt.

 
Реter Konow:

OK, ich schreibe die Schleifen und den Code, um mit den Aufträgen zu arbeiten, aber ich überlasse es Ihnen, es selbst einzurichten, denn ich habe den Motor bereits so umgestaltet, dass er über Ressourcen kommuniziert, und ich teste das gerade. Im Moment kann ich den alten Link nicht wiederherstellen, und ich habe den neuen noch nicht fertiggestellt.

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

Tag Konow:

Das heißt, um einen neuen Wert in eine Zelle einer bestehenden Zeile zu setzen, müssen Sie die Hauptzeile und den Wert senden.

Das scheint mir einfach zu sein. Wenn Ihr Ansatz so funktioniert, wie ich denke, dann sehe ich kein Problem mit einer dynamischen Tabelle oder der Aktualisierung von Positionswerten über einen Timer. Peter, warum musstest du von Anfang an einen Buckel machen?)

Grund der Beschwerde: