[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 247

 

sss2019, сейчас времени нет разбираться, извини.

Zhunko:
Неправильно. Правильно, как выше показал.

 Как руки дойдут, исправлю прогоню и там отредактирую код в сообщении.

Вопрос. Как получить указатель на строку? string MQL4 это lpsz C++, как я понял. А как же получить сам адрес строки?

 
Подскажите у кого есть идея как заставить один и тот же советник работать с разными магиками. задача в том чтобы когда появляется замок, то робот  отдельно разруливал эту ситуацию не мешая остальным ордерам. тоесть у нас открыта 1 позиция на Bay (магик 001) рынок пошол не в нашу и заместь того чтобы закрыть сделку открывается противоположная сделка на Sell c магиком 001, дальше робот будет разруливать эту ситуацию но чтобы не ждать длительного времени пока разрулится ситуация я хочу снова открыть Bay но уже с магиком (002) и в случае неудачи с трендом снова откроется замок Sell с магиком (002) и т.д. подскажите как заставить сделки работать так сказать слоями с разными магиками? может кто то сталкивался? или как реализовать?
 
pasha5282:
Подскажите у кого есть идея как заставить один и тот же советник работать с разными магиками. задача в том чтобы когда появляется замок, то робот  отдельно разруливал эту ситуацию не мешая остальным ордерам. тоесть у нас открыта 1 позиция на Bay (магик 001) рынок пошол не в нашу и заместь того чтобы закрыть сделку открывается противоположная сделка на Sell c магиком 001, дальше робот будет разруливать эту ситуацию но чтобы не ждать длительного времени пока разрулится ситуация я хочу снова открыть Bay но уже с магиком (002) и в случае неудачи с трендом снова откроется замок Sell с магиком (002) и т.д. подскажите как заставить сделки работать так сказать слоями с разными магиками? может кто то сталкивался? или как реализовать?
int MagicNumber=001;
//---
if (OrdersTotal()>0) // проверяем, есть ли ордера
{  for (int i=OrdersTotal()-1; i>=0; i--) // перебор ордеров
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // выбирается ордер среди открытых и отложенных ордеров
      {  if (OrderSymbol()!=Symbol()) continue; // проверяем - ордер по текущему символу?
         if (OrderMagicNumber()!=MagicNumber) continue; // проверяем - ордер с нужным магиком?
         //---
         if (OrderType()==OP_BUY) // если это открытая позиция на покупку, то ...
           {  // ... какие-то действия
                 return(0);
           }
         //---
         else
         if (OrderType()==OP_SELL) // если это открытая позиция на продажу, то ...
           {  // ... какие-то действия
                 return(0);
           }
}  }  }

Пример счётчика открытых и отложенных ордеров по нужному символу и магику

string _Symbol="AUDUSD";
int MagicNumber=555;
//---
int Opened_pos=0;
if (OrdersTotal()>0)
{  for (i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()==_Symbol)
         {  if (OrderMagicNumber()==MagicNumber)
            Opened_pos++;
}  }  }  }
 

Почему-то заглючил терминал при тестировании. Теперь, когда его включаешь, он начинает использовать около 150 мб памяти и зависает. Собирался переустановить, но перед этим перенести все свои файлы. Когда открыл папки, обнаружил, что там находятся не все файлы, которые я создавал. Где находятся остальные? 


 
silhouette:

Почему-то заглючил терминал при тестировании. Теперь, когда его включаешь, он начинает использовать около 150 мб памяти и зависает. Собирался переустановить, но перед этим перенести все свои файлы. Когда открыл папки, обнаружил, что там находятся не все файлы, которые я создавал. Где находятся остальные?

Левый скрин этож MQL5 а не 4.
 
gyfto:

sss2019, сейчас времени нет разбираться, извини.


 Как руки дойдут, исправлю прогоню и там отредактирую код в сообщении.

Вопрос. Как получить указатель на строку? string MQL4 это lpsz C++, как я понял. А как же получить сам адрес строки?

В MQL4 никак. Можно передать строку в DLL, а от туда вернуть адрес ввиде INT.
 
paladin80:
Левый скрин этож MQL5 а не 4.

Да нет, четвертый. Просто файлы четвертого при клике открываются через пятый, почему-то
 
silhouette:
Да нет, четвертый. Просто файлы четвертого при клике открываются через пятый, почему-то

Откройте MetaEditor для 5, в левом окне "Навигатор" -> на папке нажмите правой мышкой -> "Открыть папку" и там среди папок попробуйте поискать.



 
Zhunko:
В MQL4 никак. Можно передать строку в DLL, а от туда вернуть адрес ввиде INT.

//C++
#include "stdafx.h"
#include <windows.h>
#define MT4_EXPFUNC __declspec(dllexport)
struct MqlStr {
   int               len;
   char             *string;
  };
BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}
MT4_EXPFUNC int __stdcall GetStrAddress(const char *str) {    
    MqlStr* s = (MqlStr*)str;
    return (int)s->string; 
}

//MQL4

#import "StrAddress.dll"
int GetStrAddress(string str);//на входе имя инициализированной строки, на выходе её адрес
#import
//объявляем:
string s="something";
int address;
//пример использования:
int start(){
   address=GetStrAddress(s);
   Print(" адрес s равен "s);
}

 Чтобы другие так же не мучались, прикрепил целиком зазипированный проект. С исходниками, чтобы видели, что это не вирус. Некогда было разбираться, что там скомпилировано VC++ 6.0 по делу, а что там мусор. StrAddress.dll в папочке Debug.

Файлы:
straddress.zip  984 kb
 
paladin80:

Откройте MetaEditor для 5, в левом окне "Навигатор" -> на папке нажмите правой мышкой -> "Открыть папку" и там среди папок попробуйте поискать.



Спасибо, но там ничего из mt4 не оказалось. Воспользовался поиском и нашел все файлы по следующему адрессу:

C:\Users\Qwer\AppData\Local\VirtualStore\Program Files\MetaTrader 4\experts\include

Понятия не имею как они там оказались, если честно, ведь раньше сохранялось как положено.  

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