Minha abordagem. O núcleo é o motor. - página 128

 
Vasiliy Sokolov:

Merda, cara, você realmente não entende o que está acontecendo ou está tentando cortar os cantos dessa maneira?

Em qualquer painel, o fundamental e o mais complicado é a exibição da consistência. Se um pedido estiver aberto - deve ser exibido, se não estiver na guia comercial, também não deve estar no painel. Isto é elementar e "muito simples" conceitualmente. Mas para que seja "muito simples", o painel precisa ser baseado em um modelo estatal. Você não tem tal coisa, mas algum banco de dados local de curvas não consistentes em cordas enfiadas em objetos do usuário:

E agora você está tentando nos provar que não há problema, que tudo foi sugado do nada. Que os pedidos que não podem ser exibidos em sua mesa estão bem. Que as ordens que estão em sua mesa, mas que há muito tempo estão fechadas de fato - isto também é normal. E em geral, tudo é tão normal e bom, exceto que o número de posições é limitado a 20.

Você entende que a questão é a implementação da fixação da abertura/fechamento do pedido por meios internos. Isto não faz parte do mecanismo da mesa em si. É um mecanismo do USUÁRIO!

Ao invés de criticar o motor e a implementação da mesa, é melhor escrever um mecanismo adequado para fixar a abertura e o fechamento do pedido.

E tudo funcionará COM CERTEZA!

 
Реter Konow:

  1. Para isso, o usuário deve escrever um laço por si mesmo sobre os pedidos em carrapatos ou cronômetros, e verificar seus carrapatos contra os carrapatos escritos na matriz. Se não houver bilhete na matriz, isso significa que a ordem acabou de ser aberta, e então o E_Main_form_1__PnL(OrderTicket(),OrderProfit()) deve ser chamado;

4. se você escrever esses ciclos de pedidos corretamente, então a tabela funcionará corretamente....

Eu só esqueci....

Mas isso não significa que a mesa dinâmica em si não funcione.

O homem, o usuário deve estar familiarizado com a documentação, ele sabe o que colocar em que matriz e como atualizar tudo isso? Eu lhe pedi para escrever uma demonstração totalmente funcional, que seria de seu código para entender como e o que é feito e onde e o que é inserido, mas você limpou meu TOR e me devolveu na forma de uma mesa torta!

 
Vasiliy Sokolov:

Eu apenas sinto uma grande pilha de negligência em você, em seu código e em tudo que você faz, mais ou menos para as pessoas, mas quando se trata de coisas específicas, é uma besteira. Faça uma coisa que seja pequena mas boa e de alta qualidade. Você diz que tudo é simples de resolver, elementar. Mas por alguma razão você fez uma solução, na qual não há nada. O que o impediu de fazer todas essas simples fichas em uma quinzena?

Desculpe pelo negativismo. É que você me decepcionou. Eu esperava ver mais e melhor. Por favor, conserte sua demonstração. Faça bom, de alta qualidade, de acordo com o pedido e sem tais palavras: "Sim, é elementar, precisa de um ajuste aqui". Sugira uma solução fora da caixa, que poderia ser protestada.

Vasiliy, não se emocione. Eu nunca tive nenhum desrespeito. Simplesmente não trabalhei com pedidos por muito tempo e esqueci como fazê-lo. Mas é uma tarefa do usuário.

Mas o farei de qualquer forma. Como você acha tão difícil...

 
Реter Konow:

Vasily, não há necessidade de emoção. Eu não tive nenhum desrespeito. Eu simplesmente não trabalhei com pedidos por muito tempo e esqueci como fazê-lo. Mas é uma tarefa do usuário.

Mas o farei de qualquer forma. Se você acha que é tão complicado...

Então faça-o. Não acho isso tão complicado, mas repito, não há documentação para seu motor, e não sei qual matriz atualizar com quais parâmetros. O que eu preciso é de uma demonstração na forma de uma solução completa. Esta é a única maneira de entender o que você está fazendo e como funciona. Isso é exatamente o que eu esperava de vocês. Quando você o criar, discutiremos soluções técnicas. E, de modo geral, considere as críticas externas, mesmo as críticas de especialistas como positivas, porque o feedback negativo é geralmente mais valioso do que o feedback positivo.

 

Vou explicar como funciona uma mesa dinâmica:

1. Quando os botões de compra/venda são clicados, o sinal vai para o arquivo de conexão externa no bloco de caso do próprio botão.

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;

Você deve saber que uma nova fila é aberta automaticamente se um novo bilhete for enviado para oE_Main_form_1__Price(ticket, OrderOpenPrice()); função.

Se o bilhete já existir, a linha desejada é selecionada AUTOMATICAMENTE e o novo valor é definido ali.

Para fechar uma linha na tabela, chamar a função E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

O bilhete significa o bilhete de fila.

 
Реter Konow:

Vou explicar como funciona uma mesa dinâmica:

1. Quando os botões de compra/venda são clicados, o sinal vai para o arquivo de conexão externa no bloco de caso do próprio botão.

Você deve saber que uma nova fila é aberta automaticamente se um novo bilhete for enviado para oE_Main_form_1__Price(ticket, OrderOpenPrice()); função.

Se o bilhete já existir, a linha desejada é selecionada AUTOMATICAMENTE e o novo valor é definido ali.

Para fechar uma linha na tabela, chamar a função E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

Bilhete significa bilhete de fila.

Peter, faça um loop for loop no temporizador que passaria pelos pedidos abertos e enviaria as mudanças na lista de pedidos para sua mesa. Além disso, certifique-se de que o lucro da ordem em sua mesa também mude de forma dinâmica.

 
Реter Konow:

Vou explicar como funciona uma mesa dinâmica:

1. Quando os botões de compra/venda são clicados, o sinal vai para o arquivo de conexão externa no bloco de caso do próprio botão.

Você deve saber que uma nova fila é aberta automaticamente se um novo bilhete for enviado para oE_Main_form_1__Price(ticket, OrderOpenPrice()); função.

Se o bilhete já existir, a linha desejada é selecionada AUTOMATICAMENTE e o novo valor é definido ali.

Para fechar uma linha na tabela, chamar a função E_Main_form_1_CLOSE_ROW___Orders_table(ticket);

Bilhete significa bilhete de fila.

Esta é uma implementação tortuosa, e aqui está a resposta:

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Minha abordagem. Núcleo - Motor.

Vasiliy Sokolov, 2019.01.09 13:33

Peter, desculpe, mas seu trabalho não é aceito, pois o que você enviou é um raro trabalho de hack. Desculpe, mas parece que eu sou o único que dirigiu o que você enviou, e ninguém mais fará a especialização além de mim.

Portanto, em ordem, a tarefa foi a seguinte:

O que eu vejo ao invés disso:

Em primeiro lugar, as negociações só podem ser abertas em seu painel clicando no botão comprar/vender. Se a posição for aberta através da janela padrão, o comércio não aparece.

....

Até o momento, um gordo não vai. Aguardando seus refinamentos. E nada de renderizações em 3D até que você descubra!

 

Suponhamos que tenhamos várias tabelas dinâmicas.

O arquivo de propriedades de conexão imprimirá automaticamente as funções de embalagem para trabalhar com estas tabelas.

Aqui está um exemplo ilustrativo. Elaboramos uma tabela dinâmicaOrder_table.

Estas são as funções de invólucro que temos:

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

Nota: cada envoltório tem um nome de coluna dyn.table no final de seu nome.

O elemento específico não é especificado, apenasa linha Mágica.

Ou seja, para definir um novo valor em uma célula de uma linha existente, você tem que enviar sua magia e seu valor.

Para definir um novo valor em uma célula de uma fila inexistente, você tem que enviar seu magik e seu valor. A fila será criada automaticamente.

Para destruir uma fileira na mesa, você tem que chamar a embalagem com as palavrasCLOSE_ROW

Por exemplo:

void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)

E passe nele o majik da fila que você quer fechar.

É isso aí.

 
Vasiliy Sokolov:

Peter, faça um loop no temporizador, que passaria pelas ordens abertas e enviaria as mudanças na lista de ordens para sua mesa. Certifique-se também de que o lucro do pedido em sua mesa também mude dinamicamente.

Ok, eu escreverei ciclos e códigos para trabalhar com pedidos, mas eu o darei para você mesmo colocá-lo, porque já converti o motor para ligar através de recursos e estou testando isso. Neste momento não consigo recuperar o velho elo, e ainda não terminei o novo.

 
Реter Konow:

OK, vou escrever os loops e o código para trabalhar com os pedidos, mas vou dar a você mesmo para configurá-lo, porque já redesenhei o motor para comunicar através de recursos e estou testando isso. Neste momento não consigo recuperar o velho elo, e ainda não terminei o novo.

Trabalhe com a versão do motor que você anexou como uma demonstração.

Tag Konow:

Ou seja, para definir um novo valor em uma célula de uma linha existente, é preciso enviar seu valor e majestoso.

Parece-me simples. Se sua abordagem funciona como eu penso que funciona, então não vejo nenhum problema com uma tabela dinâmica ou com a atualização dos valores de posição através de um temporizador. Peter, por que você teve que fazer uma corcunda no início?)

Razão: