Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 207

 

Всем привет. Нужна помощь.

В моей сове открывает серию ордеров, в количестве заданном параметру MaxOrders, ниже для примера указал как это выглядит, по лотам не судить строго

1-ордер-лот=128

2-ордер-лот=256

3-ордер-лот=512

4-ордер-лот=1024

5-ордер-лот=2048

это все для тестера надо.

MaxOrders = 5, и открыто 5 ордеров. Но проблема в том что в тестере у брокера ограничение на лот 1000 стоит соответственно 4 и 5 ордер не откроется как надо.

Перерыл инэт искал как поменять в тестере в fxt файле этот параметр, не нашел точно как это сделать.

Поэтому решил силами программирования решить данный вопрос. И открывать несколько ордеров для 4 ордера получается два

4-ордер-лот=1000

4-ордер-лот=24

для 5 ордера 3:

5-ордер-лот=1000

5-ордер-лот=1000

5-ордер-лот=48

но тут две проблемы,

- как разбить правильно ММ что бы разбивали на лоты в соответствии с макс лотом

- и как открывать дополнительные ордера но что бы не нарушить порядок то есть ордеров больше будет чем в MaxOrders но не считать дополнительные ордера которые открываются для соблюдения объема.

 
solnce600:

Алексей!Добрый день!

Наше общение не выходит у меня из головы......и вот почему.....

Применительно к своему кодированию я не раз слышал замечания по поводу отсутствия логики.

Вчера Вы мне объяснили,что имеется в виду булева алгебра.Эта тема очень щирокая и очень глубокая.

Дело в том,что у меня не математический и уж тем более не алгебраический склад ума.

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

Более полугода назад,перед тем как начать изучать учебник по программирования МКЛ,я терзался сомнением:

смогу ли я его понять, не обладая математическими способностями.

Но г-н Козлов в предисловии к своему учебнику сказал,что на самом деле все гораздо проще,чем кажется на первый

взгляд.

И действительно 60-70% его учебника,как мне кажется, я сейчас способен понять(возможно не с первого раза) и как результат могу уже что-то кодировать.

До вчерашнего дня мне казалось,что все сложные математические расчеты(которые я не способен понять) делает программа,а мне нужно знать только правила по

которым программа работает и делает вычисления.

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

Если в моих кодах будет отсутствовать булева логика, мои программы будут работать некорректно,или вообще работать не будут.

Но я вчера заглянул в Википедию и понял - булева алгебра и, вероятно логика, - не для моего ума!

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

Если Вас не затруднит Вы не могли бы изложить ход своих рассуждений, предшествовавших Вашему выводу об отсутствии логики в этом фрагменте.

Если я Вас пойму - я буду двигаться дальще. Если - не пойму.....вероятно сделаю вывод о том,что программирование - это то,что сильно превышает мои способности.

Спасибо.

if (ot==0)
if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))
if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Андрей, не всё так трагично! Просто употребляй то, что понимаешь! Всё остальное придёт в своё время!

Например, проверив функцией Кима закрытие по стопу, введи дополнительную переменную Lots и перед открытием новой позиции с удвоенным лотом пиши строчку: Lots = Lot*2.0; и всё! А нормальный Lot ставишь, где не нужно удвоение!

Зачем нужны сложные коды для простых вещей? Ради наукобразия и, чтоб никто не мог разобраться? Этакая защита от "плагиата"!

 
borilunad:

Андрей, не всё так трагично! Просто употребляй то, что понимаешь! Всё остальное придёт в своё время!

Например, проверив функцией Кима закрытие по стопу, введи дополнительную переменную Lots и перед открытием новой позиции с удвоенным лотом пиши строчку: Lots = Lot*2.0; и всё! А нормальный Lot ставишь, где не нужно удвоение!

Зачем нужны сложные коды для простых вещей? Ради наукобразия и, чтоб никто не мог разобраться? Этакая защита от "плагиата"!

Борис!Спасибо за поддержку.Ты меня немного успокоил....

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

И больше всего меня бесит то,что я не могу понять о чем конкретно идет речь.

Как мне кажется отсутствие булевой логики в коде - это важно.

А как я могу узнать есть она или нет?

Вот Алексей сказал что в этом отрывке ее нет и что в реале из-за этого фрагмента у меня могут быть проблемы(хотя на тестере все ОК)

if (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

В случае ошибки в кодировании все понятно - или Метаедитор подскажет, или Журнал в Терминале.

А если у меня отсутствует логика .......как я могу об этом узнать?Только по подсказке более опытных товарищей.

Но даже после их подсказки я не понимаю о чем КОНКРЕТНО идет речь.

Изучить булеву алгебру - для меня это нереально.

 

Да забейте на эту булеву алгебру, и не вспоминайте больше.

Анекдот:

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

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

- Надо полагать, если пациент здорово, он берет чашку, а не ложку?

- Если пациент здоров, он выдергивает в ванне пробку.

* * *

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

Open[1]-Close[1] может быть отрицательным. Значит для случая когда Close>Open идин вариант, для случая Close<Open - другой вариант. Или же вычислять размер тела так, чтобы он не зависел от направления свечи.

 
solnce600:

Борис!Спасибо за поддержку.Ты меня немного успокоил....

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

И больше всего меня бесит то,что я не могу понять о чем конкретно идет речь.

Как мне кажется отсутствие булевой логики в коде - это важно.

А как я могу узнать есть она или нет?

Вот Алексей сказал что в этом отрывке ее нет и что в реале из-за этого фрагмента у меня могут быть проблемы(хотя на тестере все ОК)

if (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

В случае ошибки в кодировании все понятно - или Метаедитор подскажет, или Журнал в Терминале.

А если у меня отсутствует логика .......как я могу об этом узнать?Только по подсказке более опытных товарищей.

Но даже после их подсказки я не понимаю о чем КОНКРЕТНО идет речь.

Изучить булеву алгебру - для меня это нереально.

"Не так страшен чёрт, как его малюют!" Вначале представлю твой код читабельным, уберу лишние скобки и ненужные условия, а потом ты мне скажешь, зачем тебе эти условия!

if (ot==0)                    //если Buy, значит эти условия для закрытия или модификации?!

if (Bid==Price)               //это не будет работать на Реале! 
                              //Надо так: (Bid>=Price) или (Bid<=Price) в зависимости от направления
if(Open[1]-Close[1]>100*Point && Open[1]-Close[1]<120*Point)
if(High[1]-Open[1]>40*Point && High[1]-Open[1]<60*Point)  

if(Close[1]-Low[1]>40*Point && Close[1]-Low[1])<60*Point) 

 
borilunad:

"Не так страшен чёрт, как его малюют!" Вначале представлю твой код читабельным, уберу лишние скобки и ненужные условия, а потом ты мне скажешь, зачем тебе эти условия!

Говорю зачем мне эти лишние условия .

Условия,которые ты отправил в топку мне нужны что программа вычисляла конкретные параметры свечи с зазором в 1 пункт.

Т.е медвежья свеча с конкретным размером тела,с конкретным размером между ценой открытия и хаем,с конкретным размером расстояния между лоу и ценой закрытия.

Понимаю,что для этих целей, если я не ошибаюсь,можно так же воспользоваться NormalizeDouble (MathAbs ()).Но я не придавал значения разнице между этим вариантом и тем что использовал я.

 
solnce600:

Говорю зачем мне эти лишние условия .

Условия,которые ты отправил в топку мне нужны что программа вычисляла конкретные параметры свечи +,- 1 пункт.

Т.е медвежья свеча с конкретным размером тела,с конкретным размером между ценой открытия и хаем,с конкретным размером расстояния между лоу и ценой закрытия.

Понимаю,что для этих целей, если я не ошибаюсь,можно так же воспользоваться NormalizeDouble (MathAbs ()).Но я не придавал значения разнице между этим вариантом и тем что использовал я.

Тогда смотри выше, поправил!
 
Integer:

Да забейте на эту булеву алгебру, и не вспоминайте больше.

Анекдот:

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

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

- Надо полагать, если пациент здорово, он берет чашку, а не ложку?

- Если пациент здоров, он выдергивает в ванне пробку.

* * *

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

Open[1]-Close[1] может быть отрицательным. Значит для случая когда Close>Open идин вариант, для случая Close<Open - другой вариант. Или же вычислять размер тела так, чтобы он не зависел от направления свечи.

Спасибо за анекдот.....впредь буду стараться думать только о пробке.

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

 
borilunad:
Тогда смотри выше, поправил!

Т.е у меня было много лишних скобок? А они - вредны?!

Ну если компилятор не выдавал мне ошибки,когда я эти скобки прописывал ....я думал все ОК.

Я думал до последнего времени что если компилятор не ругается и советник работает на тестере в соответствии со своим кодом - то это однозначный ОК.

Похоже что это не совсем так.....

 
solnce600:

Борис!Спасибо за поддержку.Ты меня немного успокоил....

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

И больше всего меня бесит то,что я не могу понять о чем конкретно идет речь.

Как мне кажется отсутствие булевой логики в коде - это важно.

А как я могу узнать есть она или нет?

Вот Алексей сказал что в этом отрывке ее нет и что в реале из-за этого фрагмента у меня могут быть проблемы(хотя на тестере все ОК)

if (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

В случае ошибки в кодировании все понятно - или Метаедитор подскажет, или Журнал в Терминале.

А если у меня отсутствует логика .......как я могу об этом узнать?Только по подсказке более опытных товарищей.

Но даже после их подсказки я не понимаю о чем КОНКРЕТНО идет речь.

Изучить булеву алгебру - для меня это нереально.


Чтобы ясно изложить условия необязательно быть знатоком булевой алгебры...

Давайте я вам облегчу малость жизнь... Заменяйте if на привычное если, else на иначе, && на и, || на или и т.п. ... тогда вы уже сможете своими нормальными словами прочесть то, что написано или определиться с тем, что хотите написать.

Что написано у вас (пока опустим неверное описание условий):

1. if (ot==0) Если нет рыночных ордеров (вообще никаких, ни рыночных, ни отложенных, ни открытых этим советником, другим советником или вручную)... Если да, то выполняется строка 2, если нет, то переходим на строку 3.

2. if (Bid==Price) Если цена равна цене открытия текущей свечи... Если да, то выполняется строка 3, если нет, то переходим на строку 4.

3. if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point)) Если цена открытия первой свечи больше цены закрытия первой свечи более чем на 100 пунктов и менее, чем 120 пунктов... Если да, то выполняется строка 4, если нет, то переходим на строку 5.

4. if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point)) Если максимум первой свечи выше цены открытия первой свечи более чем на 40 пунктов и менее чем на 60 пунктов... Если да, то выполняется строка 5, если нет, то переходим на строку 6.

5. if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point)) Если закрытие первой свечи выше минимума первой свечи более чем на 40 пунктов и менее чем на 60 пунктов... Если да, то выполняется строка 6, если нет, то переходим на строку 7.

6.

7.

Как видно из данного разложения, у вас либо все строчки кода выполнятся последовательно (в случае, если каждая их них вернёт истину), либо с пропуском той строки, которая идёт следом за строкой, вернувшей ложь.

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

например:

if (ot==0) {
   if (Bid==Price) {
      // сюда можно вписать целый блок, который будет исполняться лишь при одном условии, что bid==Price
      // только вот вряд ли он когда-либо исполнится в реале
      }
   }
Вот и попробуйте, исходя из вышенаписанного, разложить свой код на составляющие, убрав к тому же и лишние скобки, в данном случае ненужные...
Причина обращения: