Почему Вы решили, что у Вас закрываемый ордер всегда имеет номер 1?
OrderSelect(1, SELECT_BY_POS, MODE_TRADES);
http://www.alpari-idc.ru/ru/experts/articles/8.html
http://www.alpari-idc.ru/ru/experts/articles/9.html
OrderSelect(1, SELECT_BY_POS, MODE_TRADES);
http://www.alpari-idc.ru/ru/experts/articles/8.html
http://www.alpari-idc.ru/ru/experts/articles/9.html
Смотрите как я сделала:
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if(High[1] >= Middle+s+gauss()) {
[b] total=OrdersTotal();
for(int l=0;l<total;l++)
{
OrderSelect(l, SELECT_BY_POS, MODE_TRADES);
if (OrderType()==OP_BUY) return (0);
if (OrderType()==OP_SELL) {
result=OrderClose(OrderTicket(),OrderLots(),Ask,10,Yellow);
return (0);
}
} [/b]
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0, "simple",16384,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
Middle = Middle+s+gauss();
}
if(Low[1] <= Middle-s+gauss()) {
[b]
total=OrdersTotal();
for(l=0;l<total;l++)
{
OrderSelect(l, SELECT_BY_POS, MODE_TRADES);
if (OrderType()==OP_SELL) return (0);
if (OrderType()==OP_BUY) {
result=OrderClose(OrderTicket(),OrderLots(),Bid,10,Yellow);
return (0);
}
} [/b]
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0, "simple",16384,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Sell order opened : ",OrderOpenPrice());
}
Middle = Middle-s+gauss();
}
}
int init() {
rand_seed = 13;
return(0);
}
Теперь система открывает одну единственную сделку, всегда на sell, потом пишет в журнале что нет маржи и закрывает по close at stop .
Наверное, вообще не закрывает ордера.
При изменении параметра s результат абсолютно не меняется, все те же цифры.
В чем может быть дело?
Я по природе не программист, мне программу помогли написать, но те, кто помогли, глубоко в этих вещах не разбираются. Честно скажу, мне это нужно для дипломной работы, и мне кажется, что кроме участников данного форума мне помочь никто не сможет.
Извините за лирику
Спасибо
Напишите мне на мейл или в асю ( "MQL4: профиль пользователя komposter" ), что именно должен делать советник.
Проще будет написать заново, чем копаться в чужом коде ;)
Проще будет написать заново, чем копаться в чужом коде ;)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ниже код советника.
При тестировании, не совершая ни одной сделки, пишет в журнале:
invalid ticket for OrderClose function много, много раз и все. Идея системы:
- в начале задаем некоторый начальный уровень Middle - значение цены и величину шага -s - в пунктах
- далее проверяем: если максимальная цена High больше суммы -
Middle + s+ случайная величина (её генерация описывается функцией gauss в начале алгоритма), то новое значение Middle = старое значение Middle +s+ сл величина, и в следующий раз берется уже это полученное значение, и т.д.
-и открывается ордер на buy, если он ещё не открыт, закрывется ордер на sell, если таковой открыт
Соответственно,
-если минимальная цена Low оказывается меньше суммы
Middle + s+ случайная величина, то новое значение Middle = старое значение Middle - s+ сл величина, и сделки совершаются наоборот.
Подскажите, где тут ошибка!
extern double Lots = 0.1; extern double Middle = 1.2850; extern double s=0.0010; int rand_seed; int i, ticket; #define c1 523793 #define c2 19157 #define c3 738623 #define gs_step 0.1 #define gs_tail 10 #define PI 3.1415926535897932384626433832795 double random(double scale) { rand_seed = (((c1 + rand_seed * c2) % c3) + 2 * c3) % c3; return ( scale * rand_seed / c3 ); } double gauss() { double s = 0, p = random(1); // sqrt(2 * PI) = 2,506628274631000502415765284811 for(double x = -gs_tail; x < gs_tail; x += gs_step) { s += gs_step * MathExp(-0.5 * x * x) / MathSqrt( 2 * PI ); if (s > p) return ((x + 10) / 20); } return ((gs_tail + 10) / 20); } void start(){ bool result; int i; if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if(High[1] >= Middle+s+gauss()) { OrderSelect(1, SELECT_BY_POS, MODE_TRADES); if (OrderType()==OP_BUY) return (0); if (OrderType()==OP_SELL) { result=OrderClose(OrderTicket(),OrderLots(),Ask,10,Yellow); return (0); } ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0, "simple",16384,0,Green); if(ticket>0){ if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } Middle = Middle+s+gauss(); } if(Low[1] <= Middle-s+gauss()) { OrderSelect(1, SELECT_BY_POS, MODE_TRADES); if (OrderType()==OP_SELL) return (0); if (OrderType()==OP_BUY) { result=OrderClose(OrderTicket(),OrderLots(),Bid,10,Yellow); return (0); } ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0, "simple",16384,0,Green); if(ticket>0){ if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Sell order opened : ",OrderOpenPrice()); } Middle = Middle-s+gauss(); } } int init() { rand_seed = 13; return(0); }Спасибо