Общее создание класса C_Trade для мета трейдера 4 - страница 2

 
denkir:

Нафига в параметры засовывать чужой объект (ну или свой)?

Имхо, лучше создать для всех торговых параметров структуру что-то типа:

и её потом принимать

А лучше сделать перегрузку методов...

Для своих торговых параметров так:

Тогда до этого нужно будет параметры проинициализировать...

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

Может я конечно чего не понял ...

 
Не хочется загонять структуру в виде кнстанты так как в эту же структуру можно принять результат выполнения метода .
 

а вы включите структуру данных в состав класса... вот как-то так:

protected:
   bool              m_is_initiated;           // флаг инициализации
   //---
   STradeElements    m_trade_elements;         // торговые элементы
   bool              m_is_logging;             // вести лог?


Потом это:

Не хочется загонять структуру в виде кнстанты так как в эту же структуру можно принять результат выполнения метода .

Дык, мухи отдельно, а котлеты тож отдельно... результат какого метода?

 
denkir:

а вы включите структуру данных в состав класса... вот как-то так:


Потом это:

Дык, мухи отдельно, а котлеты тож отдельно... результат какого метода?


SendOrder
 

VOLDEMAR:

Код не претендует на идеал по этому давайте сообща сделаем его луще!

Луще, говоришь...

1. Нет проверки на дробность лота, цвета стрелок для бай и селл одинаковы. У меня вот так сделано:

COrder* OpenOrderWithCheck(string symbol, int cmd, double volume, double price, int slippage = 0, double stoploss = 0, double takeprofit = 0,
        string comment = NULL, int magic = 0, datetime expiration = 0, color arrow_color = CLR_NONE)
    {
        int dig = (int)MarketInfo(symbol, MODE_DIGITS);    // Количество знаков после запятой по инструменту
        double minlot = MarketInfo(symbol, MODE_MINLOT);   // Минимальный размер лота
        double lotstep = MarketInfo(symbol, MODE_LOTSTEP); // Шаг изменения размера лота 
        double maxlot = MarketInfo(symbol, MODE_MAXLOT);   // Максимальный размер лота 

        int lot = (int)(volume / lotstep); // округлили до целого числа шагов изменения лота
        volume = lot * lotstep;   // теперь имеем правильный объем, кратный шагу изменения лота 
        if (volume < minlot)
        {
            // я предпочитаю такую обработку, но выдаю алерт, чтобы исправить ошибку, пару раз помогало :)  
            // ниже читаете коммент про логгирование в файлы
            volume = minlot;
            Alert("OpenOrder()", "Объем меньше минимального, задаю минимальное значение = ", volume, " лот(а)");
        }
        if (volume > maxlot)
        {
            volume = maxlot;
            Alert("OpenOrder()", "Объем больше максимального, задаю максимальное значение = ", volume, " лот(а)");
        }

        if (arrow_color == CLR_NONE && (cmd == OP_BUY || cmd == OP_BUYSTOP || cmd == OP_BUYLIMIT))
            arrow_color = m_colorBuy;
        if (arrow_color == CLR_NONE && (cmd == OP_SELL || cmd == OP_SELLSTOP || cmd == OP_SELLLIMIT))
            arrow_color = m_colorSell;
  

Перед OrderSend надо вставить ResetLastError()

 
"nj
denkir:

а вы включите структуру данных в состав класса... вот как-то так:


Потом это:

Дык, мухи отдельно, а котлеты тож отдельно... результат какого метода?

Не могу понять что не так

ведь конструкции в коде типа

   Order.m_trade_elements;
   Order.m_trade_elements.magic=227;
   Order.m_trade_elements.type=OP_BUY;

не есть хорошо ...

 
VDev:

Луще, говоришь...

1. Нет проверки на дробность лота, цвета стрелок для бай и селл одинаковы. У меня вот так сделано:

Перед OrderSend надо вставить ResetLastError()

Разве это не проверка на дробность лота ?

   if(SymbolInfoDouble (str.symbol,SYMBOL_VOLUME_STEP)==0.001) str.lots=NormalizeDouble(str.lots,3);
   if(SymbolInfoDouble (str.symbol,SYMBOL_VOLUME_STEP)==0.01) str.lots=NormalizeDouble(str.lots,2);
   if(SymbolInfoDouble (str.symbol,SYMBOL_VOLUME_STEP)==0.1) str.lots=NormalizeDouble(str.lots,1);
   if(SymbolInfoDouble (str.symbol,SYMBOL_VOLUME_STEP)==1) str.lots=NormalizeDouble(str.lots,0);
 
VOLDEMAR:

Разве это не проверка на дробность лота ?

Володя, а зачем такие заморочки? Аж четыре строки с ифами...

Вот формула определения до какого знака округлять лот.

int LotDigits = (int)MathAbs(MathLog10(MarketInfo(_Symbol, MODE_LOTSTEP)));
 
AlexeyVik:

Володя, а зачем такие заморочки? Аж четыре строки с ифами...

Вот формула определения до какого знака округлять лот.

Чуть перебрал

str.lots=NormalizeDouble(str.lots,(int)MathAbs(MathLog10(SymbolInfoDouble(str.symbol,SYMBOL_VOLUME_STEP))));
 
VOLDEMAR:

Вот накатал

Вот это не понятно

 

if(str.ticket>=0)
     {
      str.rezult=true;
      str.Get_price=str.price;
      str.error=GetLastError();
      return true;
     }

Просто чтобы в структуре вернуть реальную цену исполнения ордера, после его открытия его надо выбрать и получить OrderOpenPrice(). 

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