[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 404

 
Dimka-novitsek:
Не получается организовать цикл, X и Y всегда равны 0.

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

оформляйте код красиво и структурировано.

и не жадничайте на коментарии.

 

Да.Конечно.

Я сначала отбираю ордера с нужнім магикнумбером и на этой валютной паре. if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) {

Дальше, если нумбер и пара те.Тогда цикл for( i=OrdersTotal();i==0;i--),я в нем отбираю ордера вот таким образом OrderSelect(i,SELECT_BY_POS ); и потом считаю, сколько ордеров типо OP_SELLSTOP

Если ордеров нет, тогда открываем ордер такого типа, которого нет. Переменная X в верхнем цикле и Y в нижнем это подсчет ордеров нужного типа. Оба цикла по структуре и назначению одинаковы.

Я уже писал с обяснениями, но тут пришол папа, позвонил, принес молоко,чай и халву, а я не отправил сообщение, я пошол пописять, а папа неотправленное сообщение стер, говорит, а что, можно было в другом окне поисковика писать?? А мне ж тоже интересно,что такое паста из крапивы.Я немного психанул и отправил почти без пояснений.

Так вот, X b Y сегда равны 0. Не работает наверно цикл for. Короче, совершенно не понимаю, что там может не работать, из-за этого открываются ордера по 2 на каждом тике.


 
Dimka-novitsek:

Да.Конечно.

Я сначала отбираю ордера с нужнім магикнумбером и на этой валютной паре. if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) {

Дальше, если нумбер и пара те.Тогда цикл for( i=OrdersTotal();i==0;i--),я в нем отбираю ордера вот таким образом OrderSelect(i,SELECT_BY_POS ); и потом считаю, сколько ордеров типо OP_SELLSTOP

Если ордеров нет, тогда открываем ордер такого типа, которого нет. Переменная X в верхнем цикле и Y в нижнем это подсчет ордеров нужного типа. Оба цикла по структуре и назначению одинаковы.

Я уже писал с обяснениями, но тут пришол папа, позвонил, принес молоко,чай и халву, а я не отправил сообщение, я пошол пописять, а папа неотправленное сообщение стер, говорит, а что, можно было в другом окне поисковика писать?? А мне ж тоже интересно,что такое паста из крапивы.Я немного психанул и отправил почти без пояснений.

Так вот, X b Y сегда равны 0. Не работает наверно цикл for. Короче, совершенно не понимаю, что там может не работать, из-за этого открываются ордера по 2 на каждом тике.


абсолютно верно, циклы for делают не то, что вам нужно.

у Вас написано: for( i=OrdersTotal();i==0;i--)

1) Если ордеров 0, то цикл выполнится 1 раз. При этом он выберет неизвестно что и с этим неизвестно что сделает неизвестно что =)

2) Если ордеров больше 0, то цикл вообще не начнет выполняться, потому что условие "i==0" не выполнено

 
Спасибо!! Сейчас еще перечитаю справку!
 
Да! Спасибо!!
 
Ds вы знаете, не могу довести до ума, все то же.
//+------------------------------------------------------------------+
//|                                                    для лавин.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern double stoploss=0; extern double takeprofit=20;extern int otstup=20; extern datetime expiration=0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
 int tiket,tikett;double volume=0.1;int i=0,R1=0,R2=0,A=1 ;double price=PRICE_OPEN;
   //  R1=((PRICE_OPEN- stoploss*Point)*stoploss)/stoploss;R2=((PRICE_OPEN+ stoploss*Point)*stoploss)/stoploss;
     
     
int start()
  {       int X,Y; double price=(Ask+Bid)/2;            
//----
       Alert ("OrdersTotal()",OrdersTotal());

if(OrderSymbol()==Symbol()&&OrderMagicNumber( )==1000){
 for(int i=OrdersTotal();i>0;i--){Alert ("i", i);
OrderSelect(i,SELECT_BY_POS );if(OrderType( )==OP_BUYSTOP){X++;}}}Alert ("X", X);
if (X==0){


   tiket= OrderSend( Symbol(), OP_BUYSTOP,  volume*A, price +otstup*Point, Point* 3, R1, price+takeprofit*Point+otstup*Point, "OP_BUYSTOP", 1000,  expiration, Red); 
   Alert ("OP_BUYSTOP", GetLastError( )); }
   
if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) { 
 for ( i=OrdersTotal();i>0;i--){Alert ("i", i); OrderSelect(i,SELECT_BY_POS );
if(OrderType( ) ==OP_SELLSTOP) { Y++;}}}Alert ("Y", Y);
 if (Y==0){ 
   tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, price -otstup*Point, Point* 3,R2, price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );
    Alert ("OP_SELLSTOP", GetLastError( )); 
    }       
   
//----
   return(0);
  }
//+-------------------------------------------
В справке написано

Выражение2 - проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for.

и т.д. Я все исправил, и ничего не изменилось..также пробовал вместо i=OrdersTotal() вписать i=5, ничего не изменилось,цикл не работает.
 
Dimka-novitsek:
В справке написано

Выражение2 - проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for.

и т.д. Я все исправил, и ничего не изменилось..также пробовал вместо i=OrdersTotal() вписать i=5, ничего не изменилось,цикл не работает.

правильно, до цикла не доходит

if(OrderSymbol()==Symbol()&&OrderMagicNumber( )==1000){
 for(int i=OrdersTotal();i>0;i--){Alert ("i", i);

у Вас написано: "Если символ ордера (какого ордера то? их много... или вообще ни одного) равен текущему и его magic (кого его-то?) равен 1000, то запустить цикл"

а надо : "запустить цикл. В нем: 1) выбрать ордер. 2) и если символ =.. и magic =1000, то X++;"

 

Некоторые ДЦ на реальных счетах именам символов присваивают всякие префиксы типа "." или "FXF".

Как мне подставлять эти префиксы?

я делал так:

#define DEF_SPEC "FXF"

string SymbolsTrade[] = {"AUDCAD"DEF_SPEC ... -так не выходит

string SymbolsTrade[] = {"AUDCAD"+DEF_SPEC ... -и так тоже не получается

в итоге вместо нужного AUDCADFXF получаю просто FXF.

Не подскажите как это реализовать?
 
pusheax:

Некоторые ДЦ на реальных счетах именам символов присваивают всякие префиксы типа "." или "FXF".

Как мне подставлять эти префиксы?

я делал так:

#define DEF_SPEC "FXF"

string SymbolsTrade[] = {"AUDCAD"DEF_SPEC ... -так не выходит

string SymbolsTrade[] = {"AUDCAD"+DEF_SPEC ... -и так тоже не получается

в итоге вместо нужного AUDCADFXF получаю просто FXF.

Не подскажите как это реализовать?

ну "сходу" сработал вариант:

#define DEF_SPEC "FXF"
string SymbolsTrade[] = {"AUDCAD", "EURUSD"};

int init()
{
   for (int i = 0; i < ArraySize(SymbolsTrade); i++)
      SymbolsTrade[i] = SymbolsTrade[i] + DEF_SPEC;
 

Понял, щас сделаю..

Еще, не работает условие

OrderSelect(i,SELECT_BY_POS );
if(OrderType( ) ==OP_SELLSTOP) { Y++;}Alert ("Y", Y);}
Причина обращения: