Мой подход. Ядро - Движок. - страница 128

 
Vasiliy Sokolov:

Блин, чувак, ты реально не понимаешь что происходит или пытаешься таким образом срезать углы?

У любой панели принципиальным и наиболее сложным моментом является отображение консистентного состояния. Если ордер открыт - то он должен отображаться, если его нет на вкладке "торговля", то его не должно быть и на панели. Это элементарно и "очень просто" концептуально. Но вот что бы сделать это "очень просто" нужно что бы панель была основана на модели состояний. У тебя ничего такого нет, а есть некая локальная неконсистентная кривая база база данных на стрингах засунутая в пользовательские объекты:

И вот ты сейчас пытаешься нам доказать, что проблемы никакой нет, что это все высасано из пальца. Что неотображаемые ордера в твоей таблице - это нормально. Что ордера которые есть в твоей таблице, но которые давно закрыты по факту - это тоже нормально. И вообще, у тебя все так нормально и хорошо, вот только количество позиций ограничено до 20.   

Ты пойми, что вопрос в реализации фиксирования открытия/закрытия ордера штатными средствами. Это не входит в механизм самой таблицы. Это ПОЛЬЗОВАТЕЛЬСКИЙ механизм!

Вместо того, чтобы критиковать движок и реализацию таблицы, лучше правильно написать механизм фиксирования открытия и закрытия ордера.

И все заработает ПРАВИЛЬНО!

 
Реter Konow:

  1. Для этого, пользователь должен сам написать цикл по ордерам на тиках или таймере, и сверять их тикеты с тикетами записанными в массиве. Если тикета в массиве нет, значит ордер был только что открыт и тогда вызывать E_Main_form_1__PnL(OrderTicket(),OrderProfit());

    4. Если правильно написать эти циклы по ордерам, то таблица будет работать правильно....

Я просто забыл,...

Но это не значит, что сама динамичная таблица не работает. 

Блин, пользователь наверное знаком с документацией, он знает что и в какой массив засовывать и как обновлять все это? Я просил написать тебя полностью рабочую демонстрацию что бы именно по твоему коду понять как и что делается и куда и что засовывается, ты же подтерся моим ТЗ и вернул его мне обратно в виде криво работающей таблицы!

 
Vasiliy Sokolov:

Я прям чувствю большую кучу принебрежения в тебе, в твоем коде и во всем том, что ты делаешь, вроде как для людей, но как только дело касается конкретики, начинается фигня. Сделай что-то одно, небольшое но хорошо и качественное. Вот ты говоришь, все мол, просто решается, элементарно. Но почему-то сделал решение, в которой ничего такого нет. Что мешало тебе сделать все эти простые фишки за две недели? 

Извини за негативные эмоции. Просто ты меня разочеровал. Я надеелся увидеть большее и лучшее. Исправь пожалуйста свою демо-версию. Сделай ее хорошо, качественно согласно заявке и без этих вот: "да это элементарно, нужно вот здесь подкрутить".  Предложи решение из коробки, которое можно было бы протеситрвать.

Василий, не нужно эмоций. Никакого пренебрежения у меня и в помине небыло. Просто я давно не работал с ордерами и забыл как это делать. Но это, - пользовательская задача. 

Но я все равно это сделаю. Раз ты считаешь это столь сложным...

 
Реter Konow:

Василий, не нужно эмоций. Никакого пренебрежения у меня и в помине небыло. Просто я давно не работал с ордерами и забыл как это делать. Но это, - пользовательская задача. 

Но я все равно это сделаю. Раз ты считаешь это столь сложным...

Вот и сделай. Сложным я это не считаю, но повторюсь, что документации к твоему движку нет, и какой массив обновлять с какими параметрами я не знаю. Нужна именно демонстрация в виде полностью законченного решения. Только так можно понять что и как у тебя вызывается да и как работает. Именно это я от тебя и ожидал. Когда сделаешь - тогда и обсудим технические решения. Да и вообще, воспринимай стороннюю критику, даже такюу эксперсивную как положительную, т.к. отрицательный отзыв как правило более ценен чем положительный.

 

Я поясню, как работает динамичная таблица:

1. При нажатии на кнопки buy/sell, сигнал поступает в файл External Connection в блок case самой кнопки.

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;

Нужно знать, что новый ряд открывается автоматически, если в функцию E_Main_form_1__Price(ticket, OrderOpenPrice()); послылается новый тикет.

Если тикет уже существует, то нужный ряд выберется АВТОМАТИЧЕСКИ, и туда установится новое значение.

Для закрытия ряда таблицы нужно вызвать функцию     E_Main_form_1_CLOSE_ROW___Orders_table(ticket); 

ticket - имеется ввиду тикет ряда.

 
Реter Konow:

Я поясню, как работает динамичная таблица:

1. При нажатии на кнопки buy/sell, сигнал поступает в файл External Connection в блок case самой кнопки.

Нужно знать, что новый ряд открывается автоматически, если в функцию E_Main_form_1__Price(ticket, OrderOpenPrice()); послылается новый тикет.

Если тикет уже существует, то нужный ряд выберется АВТОМАТИЧЕСКИ, и туда установится новое значение.

Для закрытия ряда таблицы нужно вызвать функцию     E_Main_form_1_CLOSE_ROW___Orders_table(ticket); 

ticket - имеется ввиду тикет ряда.

Петр, сделай в таймере цикл for, который бы перебирал открытые ордера и посылал изменения в списке ордеров в твою таблицу. Также сделай так, что бы профит ордера  в твоей таблице также менялся динамически.

 
Реter Konow:

Я поясню, как работает динамичная таблица:

1. При нажатии на кнопки buy/sell, сигнал поступает в файл External Connection в блок case самой кнопки.

Нужно знать, что новый ряд открывается автоматически, если в функцию E_Main_form_1__Price(ticket, OrderOpenPrice()); послылается новый тикет.

Если тикет уже существует, то нужный ряд выберется АВТОМАТИЧЕСКИ, и туда установится новое значение.

Для закрытия ряда таблицы нужно вызвать функцию     E_Main_form_1_CLOSE_ROW___Orders_table(ticket); 

ticket - имеется ввиду тикет ряда.

Это кривая реализация, и вот тому ответ:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Мой подход. Ядро - Движок.

Vasiliy Sokolov, 2019.01.09 13:33

Петр, извини, но твоя работа не принимается, т.к. то, что ты прислал - редкостная халтура. Извини но кажется я единственный кто запустил то, что ты прислал, и кроме меня никто экспертизу этого не сделает.

Итак по-порядку, задание было следующее:

Что я вижу вместо этого:

Во-первых, сделки можно открыть только в твоей панели, нажимая кнопку buy/sell. Если позицию открыть через стандартное окно, то сделка не появляется.

....

Пока жирный незачет. Ждем твоих доработок. И никаких отрисовок 3D, пока с этим не разберешься!

 

Допустим, у нас несколько динамичных таблиц. 

В файле Connection Properties автоматически напечатаются функции-обертки для работы с этими таблицами.

Вот наглядный пример. Мы нарисовали динамичную таблицу  Orders_table.

Вот какие функции -обертки мы получили:

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

Обращаю внимание: каждая обертка в конце своего названия имеет название колонки дин.таблицы.

Конкретный элемент не указывается, только Magic ряда.

То есть, чтобы установить новое значение в ячейку существующего ряда, нужно послать его маджик и значение.

Чтобы установить новое значение в ячейку несуществующего ряда, нужно послать его маджик и значение. Ряд будет автоматически создан.

Чтобы уничтожить ряд в таблице, нужно вызвать обертку со словами CLOSE_ROW

Например:

void E_Main_form_1_CLOSE_ROW___Orders_table(long Magic)

И передать в нее маджик ряда, который нужно закрыть.

Все.

 
Vasiliy Sokolov:

Петр, сделай в таймере цикл for, который бы перебирал открытые ордера и посылал изменения в списке ордеров в твою таблицу. Также сделай так, что бы профит ордера  в твоей таблице также менялся динамически.

Хорошо, я напишу циклы и код работы с ордерами, но передам тебе, чтобы ты сам поставил, потому что я уже переделал движок на связь через ресурсы и тестирую это. Сейчас не могу вернуть прежнюю связь, а новую еще не доделал. 

 
Реter Konow:

Хорошо, я напишу циклы и код работы с ордерами, но передам тебе, чтобы ты сам поставил, потому что я уже переделал движок на связь через ресурсы и тестирую это. Сейчас не могу вернуть прежнюю связь, а новую еще не доделал. 

Поработай с той версией движка что ты прикрепил в качестве демонстрации. 

Реter Konow:

То есть, чтобы установить новое значение в ячейку существующего ряда, нужно послать его маджик и значение.

Вроде все просто. Если твой подход работает как я думаю, то не вижу ни каких проблем ни с динамической таблицей ни с обновлением значений позиций через таймер. Петр, так зачем было горбатого лепить с самого начала?;)

Причина обращения: