My approach. The core is the engine. - page 128

 
Vasiliy Sokolov:

Shit, man, do you really not understand what's going on or are you trying to cut corners this way?

In any panel, the fundamental and most complicated thing is the display of consistency. If an order is open - it should be displayed, if it's not in the trade tab, it shouldn't be in the panel either. This is elementary and "very simple" conceptually. But to make it "very simple", the panel needs to be based on a state model. You have no such thing, but some local non-consistent curve database on strings stuffed into user objects:

And now you're trying to prove to us that there's no problem, that it's all been sucked out of thin air. That non-displayable orders in your table are fine. That the orders that are in your table, but which have long been closed in fact - this is also normal. And in general, everything is so normal and good, except that the number of positions is limited to 20.

You understand that the issue is the implementation of fixing the opening/closing of the order by in-house means. This is not part of the mechanism of the table itself. It is a USER mechanism!

Instead of criticizing the engine and the table's implementation, you'd better write a proper mechanism for fixing the order opening and closing.

And everything will work RIGHT!

 
Реter Konow:

  1. To do this, the user must write a loop by himself over the orders on ticks or timers, and check their ticks against the ticks written in the array. If there is no ticket in the array, it means that the order has just been opened, and then the E_Main_form_1__PnL(OrderTicket(),OrderProfit()) should be called;

4. If you write these order cycles correctly, then the table will work correctly....

I just forgot....

But that doesn't mean that the dynamic table itself doesn't work.

Man, the user must be familiar with the documentation, does he know what to put in what array and how to update it all? I asked you to write a fully working demonstration, which would be from your code to understand how and what is done and where and what is inserted, but you wiped my TOR and gave it back to me in the form of a crooked table!

 
Vasiliy Sokolov:

I just feel a big pile of neglect in you, in your code and all the things you do, sort of for people, but when it comes to the specifics, the bullshit starts. Do one thing that is small but good and of high quality. You say that everything is simple to solve, elementary. But for some reason you have made a solution, in which there is nothing. What prevented you from doing all these simple chips in a fortnight?

Sorry for the negativity. It's just that you disappointed me. I was hoping to see more and better. Please fix your demo. Make it good, high quality, according to the request and without such words: "Yes it is elementary, it needs a tweak here". Suggest a solution out of the box, which could be protested.

Vasiliy, don't get emotional. I have never had any disrespect. I simply did not work with orders for a long time and have forgotten how to do it. But it is a user task.

But I will do it anyway. Since you find it so difficult...

 
Реter Konow:

Vasily, there is no need for emotion. I had no disrespect whatsoever. I just did not work with orders for a long time and forgot how to do it. But it is a user task.

But I will do it anyway. If you think it's so complicated...

Then do it. I don't find it so complicated, but I repeat, there is no documentation for your engine, and I don't know which array to update with what parameters. What I need is a demonstration in the form of a complete solution. This is the only way to understand what you are doing and how it works. That's exactly what I expected from you. When you create it, we will discuss technical solutions. And in general, take external criticism, even expert one, as a positive one, because negative feedback is usually more valuable than positive feedback.

 

I will explain how a dynamic table works:

1. When the buy/sell buttons are clicked, the signal goes to the External Connection file in the case block of the button itself.

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;

You must know that a new row is opened automatically if a new ticket is sent to theE_Main_form_1__Price(ticket, OrderOpenPrice()); function.

If the ticket already exists, the desired row is selected AUTOMATICALLY and the new value is set there.

To close a row in the table call function E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

The ticket means the row ticket.

 
Реter Konow:

I will explain how a dynamic table works:

1. When the buy/sell buttons are clicked, the signal goes to the External Connection file in the case block of the button itself.

You must know that a new row is opened automatically if a new ticket is sent to theE_Main_form_1__Price(ticket, OrderOpenPrice()); function.

If the ticket already exists, the desired row is selected AUTOMATICALLY and the new value is set there.

To close a row in the table call function E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

Ticket means row ticket.

Peter, make a for loop in the timer that would go through the open orders and send changes in the list of orders to your table. Also, make sure that the profit of the order in your table also changes dynamically.

 
Реter Konow:

I will explain how a dynamic table works:

1. When the buy/sell buttons are clicked, the signal goes to the External Connection file in the case block of the button itself.

You must know that a new row is opened automatically if a new ticket is sent to theE_Main_form_1__Price(ticket, OrderOpenPrice()); function.

If the ticket already exists, the desired row is selected AUTOMATICALLY and the new value is set there.

To close a row in the table call function E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

Ticket means row ticket.

This is a crooked implementation, and here is the answer:

Forum on trading, automated trading systems and strategy testing

My approach. Core - Engine.

Vasiliy Sokolov, 2019.01.09 13:33

Peter, sorry, but your work is not accepted, as what you have sent is a rare hack job. Sorry but I seem to be the only one who ran what you sent, and no one else will do the expertise apart from me.

So, in order, the assignment was as follows:

What I see instead:

Firstly, trades can only be opened in your panel by clicking the buy/sell button. If the position is opened through the standard window, the trade does not appear.

....

So far, a fat no-go. Waiting for your refinements. And no 3D renderings until you figure it out!

 

Suppose we have several dynamic tables.

The Connection Properties file will automatically print wrapper functions to work with these tables.

Here is an illustrative example. We have drawn a dynamicOrders_table table.

These are the wrapper functions we got:

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)
//----------------------------------------------------------------------------------------------------------------

Note: each wrapper has a dyn.table column name at the end of its name.

The specific element is not specified, onlythe Magic row.

That is, to set a new value in a cell of an existing row, you have to send its Magic and value.

To set a new value in a cell of a non-existent row, you have to send its magik and value. The row will be automatically created.

To destroy a row in the table, you have to call the wrapper with the wordsCLOSE_ROW

For example:

void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)

And pass in it the majik of the row you want to close.

That's it.

 
Vasiliy Sokolov:

Peter, make a for loop in the timer, which would go through the open orders and send changes in the orders list to your table. Also make sure that the profit of the order in your table also changes dynamically.

Ok, I will write loops and code for working with orders, but I will give it to you to put it yourself, because I have already converted the engine to link through resources and am testing that. Right now I can't get the old link back, and I haven't finished the new one yet.

 
Реter Konow:

OK, I'll write the loops and code to work with the orders, but I'll give it to you to set it up yourself, because I've already redesigned the engine to communicate through resources and I'm testing that. Right now I can't get the old link back, and I haven't finished the new one yet.

Work with the version of the engine you attached as a demonstration.

Tag Konow:

That is, to set a new value in a cell of an existing row, you need to send its majic and value.

Seems simple to me. If your approach works as I think it does, then I don't see any problem with either a dynamic table or updating position values via a timer. Peter, why did you have to make a hump from the start?)