Проблема множественных заказов - страница 3

 
luisneves:


Привет, Кронин,

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

Это не так, а также часто является плохой идеей.

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

//+--------------------------------------------------------------------------------+
//| ToStr function - calls DoubleToString (double, Digits) and returns the string  |
//+--------------------------------------------------------------------------------+
string ToStr(double ValueToString)
   {
   return (DoubleToStr(ValueToString, Digits));
   }

//+--------------------------------------------------------------------------------+

... this не использует глобально объявленную переменную, она использует переменную, переданную ей при вызове...

Print("Bid price is: ", ToStr(Bid) );
 
luisneves:


Привет, Кронин,

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

Значения, которые находятся на внешнем умножаются на 10, потому что советник должен также работать на 5-значных брокерах. Я использую этот блок кода, чтобы получить это автоматически, но получаю совет от WHRoeder, который не совместим с металлами.

Спред пары может быть переменным. Поэтому я использую код для выхода за пределы уровня Stop.

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

Насколько я могу судить (извините, если это не так...), OpenDistance поддерживается как 2 пункта и ReturnDistance теперь тоже с 2. Сейчас я вижу, что ордер открывается, но не при разнице в 2 пункта. Это работает с тестером на платформе ECN брокера (IC Markets). Может ли это иметь какое-то значение?

На самом деле ордера открываются не одновременно, но похоже, что Open Distance и ReturnDist не учитываются, чтобы получить правильное расстояние для открытия ордеров.

У вас в коде написано, что;

Я включил строку, выделенную жирным шрифтом, чтобы вызвать функцию OpenOppositeOrder и здесь не уверен, что это правильно. С другой стороны, не могу понять, где происходит сравнение текущего тика с последним тиком, который произошел за 2 пункта до этого (OpenDistance).

Извините, если я начинаю утомлять вас своими вопросами.

С наилучшими пожеланиями

Луис



Привет, Кронин,

Я просто обратил больше внимания на то, зачем спрашивать, каков спред, и просто искать тестер, что что-то не так. Здесь спред равен 50 (5 цифр), так что на самом деле 5. Хмм... Я перезапущу платформу и подтвержу.

Луис

 
RaptorUK:

Это неправда и часто является плохой идеей.

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

... this не использует глобально объявленную переменную, она использует переменную, переданную ей при вызове...


Привет, RaptorUK.

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

Кстати, Вы слышали что-нибудь подобное тому, что я упомянул, относительно проблемы с тестером, то есть, что в данный момент спред составляет 50, когда в пятницу не было?

С наилучшими пожеланиями

Луис

 
luisneves:


Привет, RaptorUK.

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

С наилучшими пожеланиями

Луис

Да, идея с функцией была не совсем в том, чтобы объявить их все как void..... Я просто удалил объявление в вашей функции void MM() для LotSize, чтобы позволить советнику снова торговать... - Я думал, мы поговорим об этом позже... :-)

По поводу "не открывать на уровне 2 пунктов".
Например, у меня нет тиковых данных для тестирования, также спред больше 2 пунктов (я мог бы настроить его, но что это даст, если у меня нет тиковых данных?). Все это затрудняет тестирование чего-либо с надежностью закрытых стопов.


16:21:09 _help_53198_markettorderdecnqv80 inputs: EquityPercent=1; FixedLotSize=0.01; Multiplier=2; LotDigits=2; StopLoss=50; TakeProfit=20; TrailingStop=2; MinimumProfit=3; Slippage=3; OpenDistance=2; ReturnDist=1; MinStop=1; MagicNumber=8012013; MaxOrders=7;
EURUSD,M1: открыто #1 покупка 0.01 EURUSD по 1.43310 ok
EURUSD,M1: выставлен первоначальный ордер на покупку # 1
EURUSD,M1: изменить #1 купить 0.01 EURUSD по 1.43310 sl: 1.42810 tp: 1.43510 ok
EURUSD,M1: open #2 sell 0.01 EURUSD по 1.43257 ok
EURUSD,M1: Установлен противоположный ордер на продажу # 2
EURUSD,M1: изменить #2 sell 0.01 EURUSD по 1.43257 sl: 1.43757 tp: 1.43057 ok
EURUSD,M1: open #3 buy 0.01 EURUSD at 1.43283 ok
EURUSD,M1: Размещен противоположный ордер на покупку # 3
EURUSD,M1: изменить #3 buy 0.01 EURUSD по 1.43283 sl: 1.42783 tp: 1.43483 ok
EURUSD,M1: open #4 sell 0.01 EURUSD по 1.43230 ok
EURUSD,M1: Установлен противоположный ордер на продажу # 4
EURUSD,M1: изменить #4 sell 0.01 EURUSD по 1.43230 sl: 1.43730 tp: 1.43030 ok
EURUSD,M1: open #5 buy 0.01 EURUSD at 1.43280 ok
EURUSD,M1: Размещен противоположный ордер на покупку # 5
EURUSD,M1: изменить #5 buy 0.01 EURUSD по 1.43280 sl: 1.42780 tp: 1.43480 ok
EURUSD,M1: открыть #6 продать 0.01 EURUSD по 1.43200 ok
EURUSD,M1: Установлен противоположный ордер на продажу # 6
EURUSD,M1: изменить #6 sell 0.01 EURUSD по 1.43200 sl: 1.43700 tp: 1.43000 ok
EURUSD,M1: открыть #7 купить 0.01 EURUSD по 1.43250 ok
EURUSD,M1: Размещен противоположный ордер на покупку # 7
EURUSD,M1: изменить #7 buy 0.01 EURUSD по 1.43250 sl: 1.42750 tp: 1.43450 ok
EURUSD,M1: изменить #7 купить 0.01 EURUSD по 1.43250 sl: 1.43267 tp: 1.43450 ok
EURUSD,M1: изменить #7 купить 0.01 EURUSD по 1.43250 sl: 1.43283 tp: 1.43450 ok
EURUSD,M1: изменить #3 купить 0.01 EURUSD по 1.43283 sl: 1.43300 tp: 1.43483 ok
EURUSD,M1: модификация #5 покупка 0.01 EURUSD по 1.43280 sl: 1.43300 tp: 1.43480 ok
EURUSD,M1: модификация #7 купить 0.01 EURUSD по 1.43250 sl: 1.43300 tp: 1.43450 ok
Тестер: стоп-лосс #3 на 1.43300 (1.43300 / 1.43340)
Тестер: стоп-лосс #5 на 1.43300 (1.43300 / 1.43340)
Тестер: стоп-лосс #7 на 1.43300 (1.43300 / 1.43340)
EURUSD, M1: LastClosedTicket=7
EURUSD,M1: Ордер с ticketnr: 7 достиг SL! Закрываем все открытые ордера
EURUSD,M1: close #6 sell 0.01 EURUSD at 1.43200 sl: 1.43700 tp: 1.43000 at price 1.43340
EURUSD,M1: close #4 sell 0.01 EURUSD по 1.43230 sl: 1.43730 tp: 1.43030 по цене 1.43340
EURUSD,M1: закрытие #2 sell 0.01 EURUSD по 1.43257 sl: 1.43757 tp: 1.43057 по цене 1.43340
EURUSD,M1: закрытие #1 покупка 0.01 EURUSD по 1.43310 sl: 1.42810 tp: 1.43510 по цене 1.43300

С моей точки зрения, это делает то, что вы хотите. Я никогда не изменял ваш расчет для OpenOpposite или открытия начального ордера.

 
kronin:

Да, идея с функцией была не совсем в том, чтобы объявить их все как void..... Я просто удалил объявление в вашей функции void MM() для LotSize, чтобы позволить советнику снова торговать... - Я думал, мы поговорим об этом позже... :-)

По поводу "не открывать на уровне 2 пунктов".
Например, у меня нет тиковых данных для тестирования, также спред больше 2 пунктов (я мог бы настроить его, но что это даст, если у меня нет тиковых данных?). Все это затрудняет тестирование чего-либо с надежностью закрытых стопов.


16:21:09 _help_53198_markettorderdecnqv80 inputs: EquityPercent=1; FixedLotSize=0.01; Multiplier=2; LotDigits=2; StopLoss=50; TakeProfit=20; TrailingStop=2; MinimumProfit=3; Slippage=3; OpenDistance=2; ReturnDist=1; MinStop=1; MagicNumber=8012013; MaxOrders=7;
EURUSD,M1: открыто #1 покупка 0.01 EURUSD по 1.43310 ok
EURUSD,M1: выставлен первоначальный ордер на покупку # 1
EURUSD,M1: изменить #1 купить 0.01 EURUSD по 1.43310 sl: 1.42810 tp: 1.43510 ok
EURUSD,M1: open #2 sell 0.01 EURUSD по 1.43257 ok
EURUSD,M1: Установлен противоположный ордер на продажу # 2
EURUSD,M1: изменить #2 sell 0.01 EURUSD по 1.43257 sl: 1.43757 tp: 1.43057 ok
EURUSD,M1: open #3 buy 0.01 EURUSD at 1.43283 ok
EURUSD,M1: Размещен противоположный ордер на покупку # 3
EURUSD,M1: изменить #3 buy 0.01 EURUSD по 1.43283 sl: 1.42783 tp: 1.43483 ok
EURUSD,M1: open #4 sell 0.01 EURUSD по 1.43230 ok
EURUSD,M1: Установлен противоположный ордер на продажу # 4
EURUSD,M1: изменить #4 sell 0.01 EURUSD по 1.43230 sl: 1.43730 tp: 1.43030 ok
EURUSD,M1: open #5 buy 0.01 EURUSD at 1.43280 ok
EURUSD,M1: Размещен противоположный ордер на покупку # 5
EURUSD,M1: изменить #5 buy 0.01 EURUSD по 1.43280 sl: 1.42780 tp: 1.43480 ok
EURUSD,M1: открыть #6 продать 0.01 EURUSD по 1.43200 ok
EURUSD,M1: Установлен противоположный ордер на продажу # 6
EURUSD,M1: изменить #6 sell 0.01 EURUSD по 1.43200 sl: 1.43700 tp: 1.43000 ok
EURUSD,M1: открыть #7 купить 0.01 EURUSD по 1.43250 ok
EURUSD,M1: Размещен противоположный ордер на покупку # 7
EURUSD,M1: изменить #7 buy 0.01 EURUSD по 1.43250 sl: 1.42750 tp: 1.43450 ok
EURUSD,M1: изменить #7 buy 0.01 EURUSD at 1.43250 sl: 1.43267 tp: 1.43450 ok
EURUSD,M1: изменить #7 купить 0.01 EURUSD по 1.43250 sl: 1.43283 tp: 1.43450 ok
EURUSD,M1: изменить #3 купить 0.01 EURUSD по 1.43283 sl: 1.43300 tp: 1.43483 ok
EURUSD,M1: модификация #5 купить 0.01 EURUSD по 1.43280 sl: 1.43300 tp: 1.43480 ok
EURUSD,M1: модификация #7 купить 0.01 EURUSD по 1.43250 sl: 1.43300 tp: 1.43450 ok
Тестер: стоп-лосс #3 на 1.43300 (1.43300 / 1.43340)
Тестер: стоп-лосс #5 на 1.43300 (1.43300 / 1.43340)
Тестер: стоп-лосс #7 на 1.43300 (1.43300 / 1.43340)
EURUSD, M1: LastClosedTicket=7
EURUSD,M1: Ордер с ticketnr: 7 достиг SL! Закрываем все открытые ордера
EURUSD,M1: close #6 sell 0.01 EURUSD at 1.43200 sl: 1.43700 tp: 1.43000 at price 1.43340
EURUSD,M1: close #4 sell 0.01 EURUSD по 1.43230 sl: 1.43730 tp: 1.43030 по цене 1.43340
EURUSD,M1: закрытие #2 sell 0.01 EURUSD по 1.43257 sl: 1.43757 tp: 1.43057 по цене 1.43340
EURUSD,M1: закрытие #1 покупка 0.01 EURUSD по 1.43310 sl: 1.42810 tp: 1.43510 по цене 1.43300

С моей точки зрения, это делает то, что вы хотите. Я никогда не менял ваш расчет для OpenOpposite или открытия начального ордера.


Привет, Кронин,

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

Еще раз спасибо

Луис

 

Привет, Кронин,

Я только что подтвердил, что в тестере спред подскочил до 5 пунктов (50). Так что сегодня в тестере ваш код работает отлично, теперь я поставил его на демо-счет ECN и посмотрим.

С наилучшими пожеланиями

Луис

 

Привет, Кронин,

Один вопрос;

Когда советник запускается, разве он не должен подождать, пока цена отклонится на 2 пункта, прежде чем открыть первый ордер?

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

С наилучшими пожеланиями

Луис

 
luisneves:

Привет, Кронин,

Один вопрос;

Когда советник запускается, разве он не должен подождать, пока цена отклонится на 2 пункта, прежде чем открыть первый ордер?

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

С наилучшими пожеланиями

Луис

Привет Луис

Ну, возможно, так и должно быть согласно стратегии, но, конечно, не согласно коду...

if(OpenDistance*pt && BuyAllowed) //<-- this doesn't make any sense.

Вышеприведенное читается как if(2*0.0001 && true) . Любое числовое выражение, отличное от 0, интерпретируется как true. Поэтому выражение всегда истинно, если BuyAllowed истинно.

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

Попробуйте это:

//global scope
double BuyTrigger,SellTrigger;

//init function
BuyTrigger=Ask+OpenDistance*pt;
SellTrigger=Bid-OpenDistance*pt;

//start function
  OTCurrentTick=OrdersTotal();                   //reinit OrderTotal   <<-- this is already there, place the 4 lines below after this line
  if(OTCurrentTick==0&&OTLastTick>0){
     BuyTrigger=Ask+OpenDistance*pt;
     SellTrigger=Bid-OpenDistance*pt;
  }

if(Ask>BuyTrigger && BuyAllowed)                // <-- use this instead of if(OpenDistance*pt && BuyAllowed)

if(Bid<SellTrigger && SellAllowed)
 

Привет, Кронин,

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

Сейчас я тестирую лучшие настройки для использования и представлю ваш последний обновленный код.

Заранее благодарю Вас за поддержку в этих вопросах (приключения...я имею в видуCOPY00).

Луис

 

Привет, Кронин,

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

Я пытался сделать это с помощью следующего кода, но, похоже, не работает.

if(LastClosedTicket>0|| OrdersTotal()>= MaxOrders)

С наилучшими пожеланиями

Луис